Pandas dataframe OrderedDict 提取数据

Pandas dataframe OrderedDict extract data

我有一个包含一列三行的 Database.csv 文件,这些是使用 simple-salesforce 从 salesforce 导出的数据,我尝试从 OrderedDict 单元格中获取 'Name' 值数据('Name','Demand')。

数据框

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

欢迎来到 SO 社区 Pamuk!

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

以下是如何使用应用和快速 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.applydf["Type__c"] 文档。

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

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