Pandas 根据另一个数据框中的条件创建新列

时间:2021-06-28 17:10:08

标签: python-3.x pandas dataframe

我有一个数据框 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

1 个答案:

答案 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)))