Python 在另一个数据帧中查找一个数据帧的值
我有两个数据帧,我想做一个类似于excel中Vlookup的查找Python 在另一个数据帧中查找一个数据帧的值,python,pandas,Python,Pandas,我有两个数据帧,我想做一个类似于excel中Vlookup的查找 df_orig.head() A 0 3 1 4 2 6 3 7 4 8 df_new Combined Length Group_name 0 [8, 9, 112, 114, 134, 135] 6 Group 1 1 [15, 16, 17, 18, 19, 20] 6 Gro
df_orig.head()
A
0 3
1 4
2 6
3 7
4 8
df_new
Combined Length Group_name
0 [8, 9, 112, 114, 134, 135] 6 Group 1
1 [15, 16, 17, 18, 19, 20] 6 Group 2
2 [15, 16, 17, 18, 19] 5 Group 3
3 [16, 17, 18, 19, 20] 5 Group 4
4 [15, 16, 17, 18] 4 Group 5
5 [8, 9, 112, 114] 4 Group 6
6 [18, 19, 20] 3 Group 7
7 [28, 29, 30] 3 Group 8
8 [21, 22] 2 Group 9
9 [28, 29] 2 Group 10
10 [26, 27] 2 Group 11
11 [24, 25] 2 Group 12
12 [3, 4] 2 Group 13
13 [6, 7] 2 Group 14
14 [11, 14] 2 Group 15
15 [12, 13] 2 Group 16
16 [0, 1] 2 Group 17
如何将df_new[“Group_name”]
中的值添加到df_orig[“A”]
“组名称”
必须基于df\u new[“Combined”]
中的df\u orig[“A”]
中的值的查找
所以它看起来像:
df_orig.head()
A Looked_up
0 3 Group 13
1 4 Group 13
2 6 Group 14
3 7 Group 14
4 8 Group 1
谢谢大家! 这里有一种方法可以模仿vlookup。下面是一个简单的例子
import pandas as pd
df_origin = pd.DataFrame({'A': [3, 11, 0, 12, 6]})
df_new = pd.DataFrame({'Combined': [[3, 4, 5], [6, 7], [11, 14, 20],
[12, 13], [3, 1], [0, 4]],
'Group_name': ['Group 13', 'Group 14', 'Group 15',
'Group 16', 'Group 17', 'Group 18']})
df_new['ID'] = list(zip(*df_new['Combined'].tolist()))[0]
df_origin['Group_name'] = df_origin['A'].map(df_new.drop_duplicates('ID')\
.set_index('ID')['Group_name'])
结果
A Group_name
0 3 Group 13
1 11 Group 15
2 0 Group 18
3 12 Group 16
4 6 Group 14
解释
- 通过
提取zip
中列表的第一个元素df_new['Combined']
- 使用
,然后创建一系列映射drop\u duplicates
到ID
Group\u name
- 最后,使用
通过该系列将pd.Series.map
映射到df_origin['A']
Group_name
- 两步
***unest***
+合并
df=pd.DataFrame({'Combined':df.Combined.sum(),'Group_name':df['Group_name'].repeat(df.Length)})
df_orig.merge(df.groupby('Combined').head(1).rename(columns={'Combined':'A'}))
Out[77]:
A Group_name
0 3 Group 13
1 4 Group 13
2 6 Group 14
3 7 Group 14
4 8 Group 1
一些元素(例如
8
)出现在多个组中,然后会发生什么?更高的元素(更大的列表长度)更具包容性,它们是必须使用的元素…原因是当您查看dfu new中的第1、2、3行时,它们基本相同,除了第1行包含2和3中缺少的数字之外。Vlookup会在第一次发现匹配时停止,并给出正确答案。不幸的是,这是我认为可以使用的变通方法,而不是为了1而放弃第2行和第3行。谢谢JPP,有没有办法让这个解决方案也与“组合”列表中的其他数字匹配。就像使用df_origin=pd.DataFrame({'A':[4,5,7,13,0]})当然,要匹配第二个数字,请使用df_new['ID2']=list(zip(*df_new['Combined'].tolist())[1]
和group byID2
。