python - 通过另一个数据框中的匹配索引划分数据框列

标签 python pandas

我有一个这样的数据框:

        id1     name    id2   val 
0       1        'A'     1     4
1       1        'B'     1     1
2       2        'C'     3     1
. 
.
.

我有另一个数据框如下:

              new_val 
  1              2 
  3              4 

我想制作第一个数据框如下:

        id1     name    id2   val 
0       1        'A'     1     2.0
1       1        'B'     1     0.5
2       2        'C'     3     0.25
. 
.
.

我想要做的是将第一个数据框中的 val 列除以与 id2 列索引匹配的值。我们看到 id2 = 1 然后我们将 val = 4 除以 2,因为它对应于索引 1。id2 = 3 然后我们将 val = 1 除以 4 得到 0.25。

我知道我可以将它们添加到元组列表中并执行计算并重置该列,但这可以用 pandas 函数实现吗?对非常大的数据集使用 for 循环在计算上确实非常昂贵。

最佳答案

嗯,这种方式的空间效率可能较低,但它应该比循环更快:

>>> df1
   id1 name  id2  val
0    1  'A'    1    4
1    1  'B'    1    1
2    2  'C'    3    1
>>> df2 = pd.DataFrame([2,4], index=[1,3])
>>> df2
   0
1  2
3  4

所以,从设置索引开始:

>>> df1.set_index('id2', inplace=True)

然后,使用我认为正确索引的 df2:

>>> df1['divisor'] = df2
>>> df1
     id1 name  val  divisor
id2
1      1  'A'    4        2
1      1  'B'    1        2
3      2  'C'    1        4
>>> df1.val / df1.divisor
id2
1    2.00
1    0.50
3    0.25
dtype: float64

最后,为了完整起见:

>>> df1['val'] = df1.val / df1.divisor
>>> df1
     id1 name   val  divisor
id2
1      1  'A'  2.00        2
1      1  'B'  0.50        2
3      2  'C'  0.25        4
>>> df1.drop('divisor',inplace=True, axis=1)
>>> df1
     id1 name   val
id2
1      1  'A'  2.00
1      1  'B'  0.50
3      2  'C'  0.25

关于python - 通过另一个数据框中的匹配索引划分数据框列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41709239/

相关文章:

Python,如何在集成 KDE 时找到特定值?

python - Pandas - 解包不同长度的元组列表列

pandas - 将单元格值替换为传递条件的单元格轴标签

list - 在 Pandas 中替换每个单元格的多个值

python - 使用 opencv - python 检测 W2 中的单个框

python - 有没有一种快速的方法可以在 Python 中返回相同值的 Sin 和 Cos?

python - 如何使用 Qthread 通过 PyQt 更新 Matplotlib 图?

python - 如果 pandas 中已知列(或索引),如何返回值的索引(或列)标签

python - Pandas 根据用户事件创建漏斗

python - Pandas 多列中最常见的值