熊猫在两列之间找到累积差异

时间:2021-07-08 23:38:51

标签: python pandas dataframe

我对 python 很陌生,正在努力解决这个问题。我想编写一个程序,该程序允许我针对 'a' 中的每个值,找到 'b' 中高于它的所有值的累积差,并将其写入新列 'c'。我有一个像这样的熊猫数据框:

import pandas as pd
df = pd.DataFrame({'a': [10, 15, 25, 30, 10, 20], 'b': [ 10, 'na', 20, 'na', 30, 10]})
        
Index|   a  |  b  |
0    |  10  | 10  |
1    |  15  | na  |
2    |  25  | 20  |
3    |  30  | na  |
4    |  10  | 30  |
5    |  20  | 10  |
                             

我想跳过nas。 b 中的项是大于零的值,因此如果方便的话,我可以将 nas 更改为 0 并且仍然跳过所有 0 值。

理想情况下,我希望有一个像这样的新列 df['c']

Index|   a  |  b  |  c  |
0    |  10  | 10  |  0  |  # 10-10 = 0
1    |  15  | na  |  5  |  # 15 - 10 = 5
2    |  25  | 20  | 20  |  # (25-20) + (25-10) = 5 + 15 = 20
3    |  30  | na  | 30  |  # (30-20) + (30-10) = 10+20 = 30
4    |  10  | 30  |-30  |  # (10-30) + (10-20) + (10-10) = -30
5    |  20  | 10  | 10  |  # (20-10) + (20-30) + (20-20) + (20-10) = 10
        

我尝试使用 df['c] = cumsum(df['a'] - df['b']) ,但它没有完成工作——我需要从 df['a'] 中的相应值中减去 df['b'],以及所有df['b'] 列中高于它的值。

我也试过 df['c] = df['a'] * len(df['b'].unique()) - cumsum(df['b']) ,但问题是 len(df['b'].unique()) 总是相同的长度(不会根据索引改变),并且 b 中的数字不一定是唯一的(例如,10 出现在索引 0 和 5)。

谁能指出我正确的方向?

这也是我第一次使用 Stack Overflow;如果我的格式或问题有任何不清楚的地方,请告诉我。谢谢!

1 个答案:

答案 0 :(得分:4)

你离我很近!您在第二种方法中适当地重构了数学,但棘手的部分是如何通过此代码段 NaN 正确解释 len(df['b'].unique())。您可以创建一个掩码,其中 NaN 值 = 0 且非 NaN 值 = 1,然后对这些值进行累积求和以获得适当的乘法系数:

df["c"] = (df["a"] * df["b"].notnull().cumsum()) - df["b"].fillna(0).cumsum()

print(df)
    a     b     c
0  10  10.0   0.0
1  15   NaN   5.0
2  25  20.0  20.0
3  30   NaN  30.0
4  10  30.0 -30.0
5  20  10.0  10.0

为了消除解决系数小的方法,这里有一个中间输出:

>>> df["b"].notnull().cumsum()
0    1
1    1
2    2
3    2
4    3
5    4
Name: b, dtype: int64