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 循环的唯一方法吗?


慕娘9325324
浏览 178回答 2
2回答

鸿蒙传说

这将起作用:import pandas as pddf = 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   B0   0.5  121  99.5  122  40.0  193  60.0  19您可以将任意函数传递到transform.可能有一种更简洁的方法来做到这一点;它让我觉得有点凌乱。

饮歌长啸

我找到了一个可行的解决方案,尽管可能不是最优的。我链接groupby,过滤和转换以获得所需的系列,然后替换原始数据帧中的结果。import pandas as pddf = pd.DataFrame( {"A":[0., 100., 80., 40., 0., 60.],                     "B":[12,  12,   3,  19,  3,  19]} )u = ( df.groupby(by="B",  sort=False)         .filter(lambda x: x.A.min() == 0, dropna=False)         .A.transform( lambda x: (x+0.5).where(x == 0, x - 0.5) )     )df.loc[pd.notnull(u), "A"] = u给出以下结果print("\ninitial df\n",df,"\n\nintermediate series\n",u,"\n\nfinal result",df)initial df        A   B0    0.0  121  100.0  122   80.0   33   40.0  194    0.0   35   60.0  19intermediate series 0     0.51    99.52    79.53     NaN4     0.55     NaNName: A, dtype: float64final result       A   B0   0.5  121  99.5  122  79.5   33  40.0  194   0.5   35  60.0  19
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python