Python 查找表中的查找字符串值以填充第二个数据帧
我有两个数据帧,Python 查找表中的查找字符串值以填充第二个数据帧,python,python-3.x,pandas,vlookup,Python,Python 3.x,Pandas,Vlookup,我有两个数据帧,main\u df: | header_1 0 | value_1 1 | value_2 2 | value_3 3 | value_1 | header_1 | header_2 0 | value_1 | lookup_value_1 1 | value_2 | lookup_value_2 2 | value_3 | lookup_value_3 3 | value_4 | lookup_value_4 以及查找数据帧查找\u df: | header_1
main\u df
:
| header_1
0 | value_1
1 | value_2
2 | value_3
3 | value_1
| header_1 | header_2
0 | value_1 | lookup_value_1
1 | value_2 | lookup_value_2
2 | value_3 | lookup_value_3
3 | value_4 | lookup_value_4
以及查找数据帧查找\u df
:
| header_1
0 | value_1
1 | value_2
2 | value_3
3 | value_1
| header_1 | header_2
0 | value_1 | lookup_value_1
1 | value_2 | lookup_value_2
2 | value_3 | lookup_value_3
3 | value_4 | lookup_value_4
main_df
中的值不是唯一的。“lookup_df”中的值是唯一的
我只想用lookup\u df
中相应的lookup\u值来填充main
df中的一个新列
已经尝试了各种方法,包括.merge
、.join
、.map
和.lookup
main_df = pd.merge(main_df, lookup_df, how='inner', on=['header_1'])
我期待的结果是:
| header_1 | header_2
0 | value_1 | lookup_value_1
1 | value_2 | lookup_value_2
2 | value_3 | lookup_value_3
3 | value_1 | lookup_value_1
您可以通过系列使用:
main_df['header_2'] = main_df['header_1'].map(lookup_df.set_index('header_1')['header_2'])
print (main_df)
header_1 header_2
0 value_1 lookup_value_1
1 value_2 lookup_value_2
2 value_3 lookup_value_3
3 value_1 lookup_value_1
或者转换系列
,速度快一点:
计时:
#[400000 rows x 1 columns]
main_df = pd.concat([main_df]*100000).reset_index(drop=True)
In [139]: %timeit pd.merge(main_df, lookup_df, how='left', on=['header_1'])
10 loops, best of 3: 73.1 ms per loop
In [140]: %timeit main_df['header_1'].map(lookup_df.set_index('header_1')['header_2'])
10 loops, best of 3: 35.7 ms per loop
In [141]: %timeit main_df['header_1'].map(lookup_df.set_index('header_1')['header_2'].to_dict())
10 loops, best of 3: 35.1 ms per loop
编辑:
在lookup\u df
中,需要列标题\u 1
的唯一值,一种可能的解决方案是:
您必须在没有“how”关键字的情况下进行合并。像这样:
main_df = pd.DataFrame([{'header_1': 'value_1'},{'header_1': 'value_2'},{'header_1': 'value_3'},{'header_1': 'value_1'}])
lookup_df = pd.DataFrame([{'header_1':'value_1', 'header_2':'lookup_value_1'}, {'header_1':'value_2', 'header_2':'lookup_value_2'}, {'header_1':'value_3', 'header_2':'lookup_value_3'}, {'header_1':'value_4', 'header_2':'lookup_value_4'}])
main_df = pd.merge(main_df, lookup_df, on='header_1')
输出是
header_1 header_2
0 value_1 lookup_value_1
1 value_1 lookup_value_1
2 value_2 lookup_value_2
3 value_3 lookup_value_3
我想你需要main_-df['header_-2']=main_-df['header_-1'].map(查找[u-df.set_-index('header_-1')['header_-2'])
也许你想做一个左合并main\u-df=pd.merge(main\u-df,lookup\u-df,how='left',on=['header\u-1'])
@jezrael我尝试了这个方法,但是我得到了错误InvalidIndexError:重新索引只对唯一值的索引对象有效,我的查找值不是唯一的。@joshi123-如果lookup\u-df
中的数据不唯一会发生什么?你能编辑问题吗?@EdChum,左边的合并结果是一个数据帧,其中包含两个帧中的所有行,我只想要原始main\u df
中的4行,我通过创建唯一的lookup\u df
编辑答案,请检查。测试了删除重复的代码,非常感谢