Pandas 数据框 OrderedDict 提取数据

问题描述

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

数据框

Type__c
    OrderedDict([('attributes',OrderedDict([('type','Type__c'),('url','/services/data/v42.0/sobjects/Type__c/1234400000001ddAAA')])),('Name','Demand')])
    OrderedDict([('attributes','/services/data/v42.0/sobjects/Type__c/123430000004C93AAE')])),'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','/services/data/v42.0/sobjects/Type__c/1234500000001erAAA')])),'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,'Type__c')
    test=OrderedDict([('attributes','Private')])
    ***print("\n",name)***
    print(test['Name'])

结果:

 OrderedDict([('attributes','Demand')])
Private

 OrderedDict([('attributes','Stand')])
Private

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

最后我想实现 发件人

Type__c
        OrderedDict([('attributes','Demand')])
        OrderedDict([('attributes','Stand')])

Name
Demand
Demand
Stand

解决方法

欢迎来到 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','/services/data/v42.0/sobjects/Type__c/123430000004C93AAE')])),'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 用户指南部分。