我有一个数据框 df_1
,如下所示:
| A | B |
+----------+-----------+
|A | 120.0 |
|D | 2.50 |
|N | 1.00 |
|N | 0.50 |
|D | 1.50 |
|A | 240.0 |
+----------+-----------+
我还有另一个数据框 df_2
,如下所示:
| J | K | L | M |
+-----------+----------+-----------+-----------+
| 0.50 | 4.1 | 70.0 | 55.0 |
| 0.75 | 6.7 | 80.0 | 66.0 |
| 1.00 | 8.2 | 90.0 | 95.0 |
| 1.50 | 9.6 | 120.0 | 186.0 |
| 2.50 | 10.7 | 240.0 | 188.0 |
+-----------+----------+-----------+-----------+
目标是在 Z
中创建一个名为 df_1
的新列,其中我们根据列 A 中的条件在 df_2 中查找列 B (df_1
) 的值( df_1
。例如,在如下所示的 Z 列中,A 的值为 186.0,这是通过在 {{1} 中的 L 和 M 列中查找值 120.0(在 df_1
中)获得的}}. 同样,D、N 的值分别通过查看 J 和 K 列获得。最终的数据框如下所示
df_2
那么,如何在 Pandas 中实现与我们在 Excel vlookup 中实现的类似?
编辑:
如果 | A | B | Z |
+----------+-----------+----------
|A | 120.0 | 186.0 |
|D | 2.50 | 10.7 |
|N | 1.00 | 8.2 |
|N | 0.50 | 4.1 |
|D | 1.50 | 9.6 |
|A | 240.0 | 188.0 |
+----------+-----------+---------+
如下所示怎么办?我们还能得到和上面一样的结果吗?
df_2
答案 0 :(得分:0)
IIUC,您可以使用:
df1['c'] = df1.B.map(dict(df2.values.reshape(-1,2)))
A B c
1 A 120.0 186.0
2 D 2.5 10.7
3 N 1.0 8.2
4 N 0.5 4.1
5 D 1.5 9.6
6 A 240.0 188.0
完整示例:
df1 = pd.DataFrame({'A': {1: 'A', 2: 'D', 3: 'N', 4: 'N', 5: 'D', 6: 'A'},
'B': {1: 120.0, 2: 2.5, 3: 1.0, 4: 0.5, 5: 1.5, 6: 240.0}})
df2 = pd.DataFrame({'J': {0: 0.5, 1: 0.75, 2: 1.0, 3: 1.5, 4: 2.5},
'K': {0: 4.1, 1: 6.7, 2: 8.2, 3: 9.6, 4: 10.7},
'L': {0: 70.0, 1: 80.0, 2: 90.0, 3: 120.0, 4: 240.0},
'M': {0: 55.0, 1: 66.0, 2: 95.0, 3: 186.0, 4: 188.0}})
df1['c'] = df1.B.map(dict(df2.values.reshape(-1, 2)))