Python 如何从OrderedPicts数组中提取值?
如果我有一个csv文件行,其中一列包含ordereddict,那么如何创建一个新列,并使用python(3.+)/pandas(.18)提取每个ordereddict的单个元素 这里有一个例子。我的列,Python 如何从OrderedPicts数组中提取值?,python,pandas,Python,Pandas,如果我有一个csv文件行,其中一列包含ordereddict,那么如何创建一个新列,并使用python(3.+)/pandas(.18)提取每个ordereddict的单个元素 这里有一个例子。我的列,attributes,在ordereddicts中隐藏了billingPostalCodes。我所关心的就是用billingPostalCodes创建一个列 下面是我的数据现在的样子: import pandas as pd from datetime import datetime imp
attributes
,在ordereddicts中隐藏了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循环?我已经尝试了很多不同的方法,但是在数据帧上我什么都做不到
提前感谢您,如果需要更具体的说明,请告诉我。这花了我一段时间才解决,但问题通过执行以下操作得到解决:
df.apply(lambda row: row["attributes"]["BillingPostalCode"], axis = 1)
这里的技巧是要注意,axis=1
强制pandas
遍历每一行,而不是每一列(这是默认设置,如中所示)
DataFrame.apply(func,axis=0,broadcast=False,raw=False,reduce=None,
args=(),**kwds)
沿数据帧的输入轴应用函数
传递给函数的对象是具有以下索引的系列对象:
数据帧的索引(轴=0)或列(轴=1)。返回类型
取决于传递的函数是聚合还是reduce参数
如果数据帧为空
参数:
- func:应用于每列/每行的函数
- 轴:{0或'index',1或'columns'},默认为0
- 0或“索引”:将函数应用于每列
- 1或“列”:将函数应用于每一行
attributes
),然后从那里仅提取BillingPostalCode
您需要格式化生成的数据框以获得正确的列名。这看起来应该可以,但我在尝试此操作时遇到了
TypeError:(“字符串索引必须是整数”,“发生在索引0处”)
。你知道为什么会这样吗?@AndrewKraemer我用你引用的例子验证了这一点,效果很好。你用的是什么版本的熊猫?我在熊猫0.18上。我怀疑在旧版本的Pandas行索引中,这样的索引是使用整数,而不是列名。请尝试第[1][“BillingPostalCode”]
行。我确实在.18上。我运行了你推荐的,得到了同样的问题。如果有帮助的话,我可以上传实际的数据集。属性列中的数据似乎保存为字符串,其中它需要是collections.OrderedDict才能工作。不知道如何将字符串转换为OderedDict。实际上,这是可行的!我在生产上试过了,我得到了结果!非常感谢你!