gpt4 book ai didi

python - Pandas 发现两列之间的累积差异

转载 作者:行者123 更新时间:2023-12-04 13:08:20 26 4
gpt4 key购买 nike

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

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['b'] 中的相应值中减去 df['a'],以及 df['b' 列中它上面的所有值].

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

谁能指出我正确的方向?

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

最佳答案

你非常接近!您在第二种方法中适本地重构了数学,但是棘手的部分是如何通过此代码段 len(df['b'].unique()) 正确解释 NaN >。您可以创建一个掩码,其中 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

关于python - Pandas 发现两列之间的累积差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68309675/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com