如何从Ordereddicts数组中提取价值?

时间:2016-04-14 21:35:33

标签: python pandas

如果我有一个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循环?我已经尝试了很多不同的东西,但我无法在数据框架上工作。

提前致谢,如果我需要更具体,请告诉我。

1 个答案:

答案 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以获得正确的列名。