我有一个与此类似的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循环中的循环更简单的方法,特别是因为这是一个非常大的数据集。最简洁的方法是什么?
答案 0 :(得分:2)
您可以使用dict
的{{1}} map
使用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
最后一次如果需要删除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