Python 2.7 基于字典中的值向dataframe列添加字典

Python 2.7 基于字典中的值向dataframe列添加字典,python-2.7,pandas,dictionary,dataframe,Python 2.7,Pandas,Dictionary,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

我有一个与此类似的数据帧:

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'}]
我还有一个字典列表,它比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循环中的for循环更简单的方法来实现这一点,特别是因为这是一个非常大的数据集。实现这一点最干净的方法是什么?

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

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
输出为:

        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
      City     State  age  id  name
1058  Chicago    IL   37  1058  Tom
3425  NewYork    NY   24  3425  Sue
8854  StLouis    MO  NaN   NaN  NaN
但是,更有用的方法是通过执行以下操作将dict键设置为列:

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
输出为:

        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
      City     State  age  id  name
1058  Chicago    IL   37  1058  Tom
3425  NewYork    NY   24  3425  Sue
8854  StLouis    MO  NaN   NaN  NaN

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

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
输出为:

        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
      City     State  age  id  name
1058  Chicago    IL   37  1058  Tom
3425  NewYork    NY   24  3425  Sue
8854  StLouis    MO  NaN   NaN  NaN
但是,更有用的方法是通过执行以下操作将dict键设置为列:

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
输出为:

        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
      City     State  age  id  name
1058  Chicago    IL   37  1058  Tom
3425  NewYork    NY   24  3425  Sue
8854  StLouis    MO  NaN   NaN  NaN
您可以通过
dict
dict
键使用
id

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
最后,如果需要,请删除
new
列添加中带有
NaN
的行:

您可以通过
dict
dict
键使用
id

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
最后,如果需要,请删除
new
列添加中带有
NaN
的行:


你确定它是正确的吗?没有使用
成员id
id
的加入。对不起,应该更清楚一些。字典没有任何特定的顺序,这就是为什么我需要将“id”与“member\u id”链接起来。因为它们的长度不同,这也会留下一个长度值错误。我对这个问题做了修改,没注意到。我将发布一个补丁简短地发布一个补丁和一些奖励:)你确定它是正确的吗?没有使用
成员id
id
的加入。对不起,应该更清楚一些。字典没有任何特定的顺序,这就是为什么我需要将“id”与“member\u id”链接起来。因为它们的长度不同,这也会留下一个长度值错误。我对这个问题做了修改,没注意到。我将发布一个补丁简短地发布一个补丁和一些额外的东西:)我的数据实际上有一个字符串形式的member_id,但是通过去掉int()这是一个简单的补丁。你结束了几个小时的折磨。非常感谢。我的数据实际上有一个字符串形式的member_id,但是去掉int()就可以很容易地解决这个问题。你结束了几个小时的折磨。非常感谢。