【问题标题】:Pandas dataframe OrderedDict extract dataPandas 数据框 OrderedDict 提取数据
【发布时间】:2021-04-01 20:06:26
【问题描述】:

我有一个 Database.csv 文件,其中包含一列和 3 行,这些是使用 simple-salesforce 从 salesforce 导出的数据,我尝试从 OrderedDict 单元格数据中获取“名称”值(“名称”, '需求')。

数据框

Type__c
    OrderedDict([('attributes', OrderedDict([('type', 'Type__c'), ('url', '/services/data/v42.0/sobjects/Type__c/1234400000001ddAAA')])), ('Name', 'Demand')])
    OrderedDict([('attributes', OrderedDict([('type', 'Type__c'), ('url', '/services/data/v42.0/sobjects/Type__c/1234400000001ddAAA')])), ('Name', 'Demand')])
    OrderedDict([('attributes', OrderedDict([('type', 'Type__c'), ('url', '/services/data/v42.0/sobjects/Type__c/123430000004C93AAE')])), ('Name', 'Stand')])

使用下面的代码,我读取 csv 文件,并为每一行分配包含“OrderedDict([....) 的值来命名,并且我想打印“名称”字段值,

import pandas as pd
from collections import OrderedDict
df = pd.read_csv('Database.csv')
for index, row in df.iterrows():
    name = df._get_value(index, 'Type__c')
    base=OrderedDict([('attributes', OrderedDict([('type', 'Type__c'), ('url', '/services/data/v42.0/sobjects/Type__c/1234500000001erAAA')])), ('Name', 'Private')])
    print("\n",name['Name'])
    print(base['Name'])

结果:

.
print("\n",name['Name'])
    TypeError: string indices must be integers

当我将 print("\n",name['Name']) 更改为 print("\n",name) 以测试手动添加的 OrderedDict 时,我可以看到它有效

import pandas as pd
from collections import OrderedDict
df = pd.read_csv('Database.csv')
for index, row in df.iterrows():
    name = df._get_value(index, 'Type__c')
    test=OrderedDict([('attributes', OrderedDict([('type', 'Type__c'), ('url', '/services/data/v42.0/sobjects/Type__c/1234500000001erAAA')])), ('Name', 'Private')])
    ***print("\n",name)***
    print(test['Name'])

结果:

 OrderedDict([('attributes', OrderedDict([('type', 'Type__c'), ('url', '/services/data/v42.0/sobjects/Type__c/1234400000001ddAAA')])), ('Name', 'Demand')])
Private

 OrderedDict([('attributes', OrderedDict([('type', 'Type__c'), ('url', '/services/data/v42.0/sobjects/Type__c/1234400000001ddAAA')])), ('Name', 'Demand')])
Private

 OrderedDict([('attributes', OrderedDict([('type', 'Type__c'), ('url', '/services/data/v42.0/sobjects/Type__c/123430000004C93AAE')])), ('Name', 'Stand')])
Private

我有一个包含数千行的文件,必须有办法创建一个名为“名称”的新列并添加文本数据

最后我想实现 来自

Type__c
        OrderedDict([('attributes', OrderedDict([('type', 'Type__c'), ('url', '/services/data/v42.0/sobjects/Type__c/1234400000001ddAAA')])), ('Name', 'Demand')])
        OrderedDict([('attributes', OrderedDict([('type', 'Type__c'), ('url', '/services/data/v42.0/sobjects/Type__c/1234400000001ddAAA')])), ('Name', 'Demand')])
        OrderedDict([('attributes', OrderedDict([('type', 'Type__c'), ('url', '/services/data/v42.0/sobjects/Type__c/123430000004C93AAE')])), ('Name', 'Stand')])

Name
Demand
Demand
Stand

【问题讨论】:

    标签: python pandas dataframe salesforce ordereddict


    【解决方案1】:

    欢迎来到 SO 社区 Pamuk!

    与遍历数据帧的行相比,将特定函数“应用”到整个列(甚至是数据帧的子集)要高效得多。这样,pandas 将为您处理性能,并且通常更具可读性(因为您不必添加任何迭代逻辑)。

    以下是如何使用 apply 和快速 lambda 函数获取“名称”列(只有最后一行与您相关,其余用于复制您的示例数据框):

    from collections import OrderedDict
    import pandas as pd
    
    data = [
        OrderedDict([('attributes', OrderedDict([('type', 'Type__c'), ('url', '/services/data/v42.0/sobjects/Type__c/1234400000001ddAAA')])), ('Name', 'Demand')]),
        OrderedDict([('attributes', OrderedDict([('type', 'Type__c'), ('url', '/services/data/v42.0/sobjects/Type__c/1234400000001ddAAA')])), ('Name', 'Demand')]),
        OrderedDict([('attributes', OrderedDict([('type', 'Type__c'), ('url', '/services/data/v42.0/sobjects/Type__c/123430000004C93AAE')])), ('Name', 'Stand')]),
    ]
    
    df = pd.DataFrame({"Type__c": data})
    df["Name"] = df["Type__c"].apply(lambda x: x["Name"])
    

    有关更多示例和详细信息,请参阅 Pandas Series.apply since df["Type__c"] 文档。

    对于涉及一次使用更多列的更复杂的逐行操作,您可以查看DataFrame.apply 的文档并将函数应用于数据框本身(或其子集)。

    有关与您正在做的事情非常相关的文档中更易读的部分,请查看Function Application 上的 Pandas 用户指南部分。

    【讨论】:

    • 您好,感谢您的欢迎,您的代码示例作为脚本运行良好,不幸的是我的问题是当我从 csv 读取数据帧时,您的代码出现以下代码错误: df = pd.DataFrame({"Type__c": data}) 行和错误是 ValueError: If using all scalar values, you must pass a index.我假设如果您在 OrderedDict 代码中编写它会识别并处理它,但是如果我尝试从数据框中读取文本,它不会运行 OrderedDict。
    • 我只是尝试将数据保存到一个文件并从那里读取,它对我来说效果很好。顺便说一句,您应该只使用最后一行代码df["Name"] = df["Type__c"].apply(lambda x: x["Name"])。该错误听起来更像 data 变量不是列表(或可迭代)(请参阅此问题 --> stackoverflow.com/questions/17839973/… )。
    猜你喜欢
    • 2016-04-20
    • 2019-06-28
    • 1970-01-01
    • 1970-01-01
    • 2021-10-24
    • 1970-01-01
    • 1970-01-01
    • 2019-04-23
    • 2017-10-01
    相关资源
    最近更新 更多