Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 查找表中的查找字符串值以填充第二个数据帧_Python_Python 3.x_Pandas_Vlookup - Fatal编程技术网

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
编辑答案,请检查。测试了
删除重复的代码,非常感谢