gpt4 book ai didi

python - 将累积和最大值分配给数据点分组

转载 作者:行者123 更新时间:2023-12-04 03:54:32 26 4
gpt4 key购买 nike

如果我有一个像这样的 pandas 数据框:

 df = pd.Dataframe()
df['Values'] = [2, 4, 2, 5, np.nan, np.nan, 5, 8, 2, 1, np.nan, np.nan, np.nan])

我可以像这样对数据框求和(当我有一个新的非 nan 分组时重新开始计数):

 df['Cumulative Sum'] = df.Values.groupby(df.Values.isna().cumsum()).cumsum()

这样我得到:

 df['Cumulative Sum'].values
array([ 2., 6., 8., 13., nan, nan, 5., 13., 15., 16., nan, nan, nan])

如何将累积和最大值分配给每个非 nan 数据分组,以便我得到:

 array([13., 13., 13., 13., nan, nan, 16., 16., 16., 16., nan, nan, nan])

我在尝试使用 nan 值进行分组,但遇到了困难:

 df['Cumulative Sum'].groupby(df['Cumulative Sum'].isna().cummax()).cummax()

最佳答案

尝试:

df.groupby(df['Values'].isna().cumsum())['Values']\
.transform('sum').where(df['Values'].notna())

输出:

0     13.0
1 13.0
2 13.0
3 13.0
4 NaN
5 NaN
6 16.0
7 16.0
8 16.0
9 16.0
10 NaN
11 NaN
12 NaN
Name: Values, dtype: float64

详细信息。

使用 isna 为 NAN 创建一个 bool 系列 True,然后使用 cumsum 为每个 NaN 递增创建非 NaN 值组。接下来,groupby 这个组和总和,使用 transform 将该总和分配给数据帧中的每一行。最后,您可以使用 where 屏蔽 NaN 值。

更好一点的代码:

s = df['Values'].isna()
df.groupby(s.cumsum())['Values'].transform('sum').mask(s)

关于python - 将累积和最大值分配给数据点分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64069537/

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