如果我有一个csv文件行,其中一列有orderdicts,我如何使用python(3。+)/ pandas(.18)创建一个新列提取每个ordereddict的单个元素?
这是一个例子。我的专栏attributes
在{order}中隐藏了billingPostalCodes
。我所关心的只是使用billingPostalCodes
创建一个列。
以下是我的数据现在的样子:
import pandas as pd
from datetime import datetime
import csv
from collections import OrderedDict
df = pd.read_csv('sf_account_sites.csv')
print(df)
的产率:
id attributes
1 OrderedDict([(u'attributes', OrderedDict([(u'type', u'Account'), (u'url', u'/services/data/v29.0/sobjects/Account/001d000001tKZmWAAW')])), (u'BillingPostalCode', u'85020')])
2 OrderedDict([(u'attributes', OrderedDict([(u'type', u'Account'), (u'url', u'/services/data/v29.0/sobjects/Account/001d000001tKZmWAAW')])), (u'BillingPostalCode', u'55555')])
...
如果我这样做,我在个人层面上知道:
dict = OrderedDict([(u'attributes', OrderedDict([(u'type', u'Account'), (u'url', u'/services/data/v29.0/sobjects/Account/001d000001tKZmWAAW')])), (u'BillingPostalCode', u'85020')])
print(dict['BillingPostalCode'])
结果我会得到85020。
我有什么要让它看起来像这样?
id zip_codes
1 85020
2 55555
...
我是否必须使用应用功能?一个for循环?我已经尝试了很多不同的东西,但我无法在数据框架上工作。
提前致谢,如果我需要更具体,请告诉我。
答案 0 :(得分:0)
我花了一些时间来研究,但问题通过以下方式解决:
df.apply(lambda row: row["attributes"]["BillingPostalCode"], axis = 1)
这里的诀窍是要注意axis = 1
强制pandas
遍历每一行,而不是每一列(这是默认设置,如docs中所示)。
DataFrame.apply(func,axis = 0,broadcast = False,raw = False,reduce = None, args =(),** kwds)
沿DataFrame的输入轴应用函数。
传递给函数的对象是具有索引的Series对象 DataFrame的索引(轴= 0)或列(轴= 1)。返回类型 取决于是否传递函数聚合或reduce参数 如果DataFrame为空。
参数:
- func:function要应用于每个列/行的函数
- 轴:{0或'索引',1或'列'},默认为0
- 0或'index':将函数应用于每列
- 1或'columns':将函数应用于每一行
从那里开始,首先提取相关列(在本例中为attributes
- 然后从那里仅提取BillingPostalCode
)是一件简单的事情。
您需要格式化生成的DataFrame以获得正确的列名。