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()就可以很容易地解决这个问题。你结束了几个小时的折磨。非常感谢。