首页 > 解决方案 > Pandas - 基于与另一列的交叉引用计算新值

问题描述

我正在尝试计算其值与另一列交叉引用的列中的新值。

>>> import pandas as pd
>>> df = pd.DataFrame( {"A":[0., 100., 80., 40., 0., 60.], 
                        "B":[12,  12,   3,  19,  3,  19]} )
>>> df
       A   B
0    0.0  12
1  100.0  12
2   80.0   3
3   40.0  19
4    0.0   3
5   60.0  19

我想在 A 列中找到所有为 0 的值,在 B 列中找出相应的值,然后根据某个函数更改具有相同 B 列值的所有 A 列值。例如,在上面的示例中,我想将 A 列的前两个值df.A[0]df.A[1]0. 和 100. 分别更改为 0.5 和 99.5,因为df.A[0]是 0. 并且它df.B[0] = 12在 B 列中的值与df.B[1] = 12.

df
      A   B
0   0.5  12
1  99.5  12
2  79.5   3
3  40.0  19
4   0.5   3
5  60.0  19

我尝试链接 loc、aggregate、groupby 和 mask 功能,但我没有成功。是通过for循环的唯一方法吗?


编辑:扩大示例以更好地说明意图。

标签: pythonpandasmethod-chainingcross-reference

解决方案


这将起作用:

import pandas as pd

df = pd.DataFrame( {"A":[0., 100., 40., 60.], "B":[12, 12, 19, 19]} )

def f(series):
    return (series + 0.5).where(series == 0, series - 0.5)

B_value = df.loc[df['A'] == 0, 'B'][0]
df.loc[df['B'] == B_value, 'A'] = df.loc[df['B'] == B_value, 'A'].transform(f)

print(df)

输出:

      A   B
0   0.5  12
1  99.5  12
2  40.0  19
3  60.0  19

您可以将任意函数传递给transform.

可能有一种更清洁的方法来做到这一点;它让我觉得有点凌乱。


推荐阅读