根据字典中的值将字典添加到Pandas数据帧列

时间:2016-12-07 20:13:03

标签: python-2.7 pandas dictionary dataframe

我有一个与此类似的Pandas DataFrame:

import pandas as pd

members = [('Chicago', 'IL', '1058'), ('New York', 'NY', '3425'), 
          ('St. Louis', 'MO', '8854')]
labels = ['City', 'State', 'member_id']
df = pd.DataFrame.from_records(members, columns = labels)

   City      State   member_id
0  Chicago   IL      1058
1  New York  NY      3425
2  St. Louis MO      8854

我还有一个字典列表,它比数据帧短,类似于:

x = [{'name':'Sue', 'age':'24', 'id':'3425'}, {'name':'Tom', 'age':'37', 'id':'1058'}]

我想根据ID将列表中的字典放入名为' new_col'的数据框中的新列中。在这种情况下,' id'从字典中可以看到' member_id'在数据框中。此外,输出应该只有添加了字典的行。

预期的输出将是这样的:

   City      State   member_id  new_col
0  Chicago   IL      1058       {'name':'Tom', 'age':'37', 'id':'1058'}
1  New York  NY      3425       {'name':'Sue', 'age':'24', 'id':'3425'}

我尝试使用这些值创建一个新数据框,但似乎无法连接这两个数据框。我还尝试添加一个新列,然后通过迭代添加字典,稍后进行过滤:

df['new_col'] = None
for key, value in df['member_id'].iteritems():
    for n in x:
        id = str(n['id'])
        if id == str(value):
            df.loc[key, 'new_col'] = n
df = df[(df['new_col'] != None)]

它引发了一个ValueError:与Series不兼容的索引器,但我并不担心,因为我认为我的整个方法都是错误的。必须有一种比for循环中的循环更简单的方法,特别是因为这是一个非常大的数据集。最简洁的方法是什么?

2 个答案:

答案 0 :(得分:2)

您可以使用dict的{​​{1}} map使用dictid

print ({int(i['id']):i for i in x})
{3425: {'id': '3425', 'age': '24', 'name': 'Sue'}, 
 1058: {'id': '1058', 'age': '37', 'name': 'Tom'}}

df['new'] = df.member_id.map({int(i['id']):i for i in x})
print (df)
        City State  member_id                                         new
0    Chicago    IL       1058  {'id': '1058', 'age': '37', 'name': 'Tom'}
1   New York    NY       3425  {'id': '3425', 'age': '24', 'name': 'Sue'}
2  St. Louis    MO       8854                                         NaN

最后一次如果需要删除NaN列中new的行添加dropna

df['new'] = df.member_id.map({int(i['id']):i for i in x})
df = df.dropna(subset=['new'])
print (df)
       City State  member_id                                         new
0   Chicago    IL       1058  {'id': '1058', 'age': '37', 'name': 'Tom'}
1  New York    NY       3425  {'id': '3425', 'age': '24', 'name': 'Sue'}

答案 1 :(得分:1)

使两个数据源共享一个索引

nextAll()

输出是:

s_x = pd.Series(x)
s_x.index = s_x.apply(lambda x:int(x['id']))
new_df = df.set_index('member_id')
new_df = pd.concat([new_df, s_x],axis=1)
print new_df

然而,更有用的是将dict键设为列:

        City    State   0
1058    Chicago IL  {u'age': u'37', u'name': u'Tom', u'id': u'1058'}
3425    NewYork NY  {u'age': u'24', u'name': u'Sue', u'id': u'3425'}
8854    StLouis MO  NaN

输出是:

df_x = pd.DataFrame(x)
df_x.index = df_x['id'].astype('int32')
new_df = df.set_index('member_id')
new_df = pd.concat([new_df, df_x],axis=1)
print new_df