Pandas-基于与另一列的交叉引用计算新值[英] Pandas - Calculate New Value Based on Cross Reference with Another Column

本文是小编为大家收集整理的关于Pandas-基于与另一列的交叉引用计算新值的处理方法,想解了Pandas-基于与另一列的交叉引用计算新值的问题怎么解决?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.B 列中的 df.B[0] = 12 值与 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 循环的唯一方法吗?

<小时>

编辑:扩展示例以更好地说明意图.

推荐答案

我找到了一个可行的解决方案,尽管可能不是最理想的.我将groupby、filter和transform链在一起得到想要的series,然后将结果替换到原始dataframe中.

import pandas as pd
df = 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   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

intermediate series
 0     0.5
1    99.5
2    79.5
3     NaN
4     0.5
5     NaN
Name: A, dtype: float64

final result       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

本文地址:https://www.itbaoku.cn/post/1727840.html