gpt4 book ai didi

python-3.x - 如何将 Pandas 列中的变量范围与另一列相加

转载 作者:行者123 更新时间:2023-12-05 01:11:58 25 4
gpt4 key购买 nike

我对 pandas 比较陌生,我不知道解决问题的最佳方法。好吧,我有一个 df:一个索引,一个名为“Data”的列中的数据和一个名为“sum”的空列。

我需要帮助来创建一个函数,以在“sum”列中添加“Data”列的可变行组的总和。分组标准是组内不能有空行。

这里是一个例子:

index  Data Sum
0 1
1 1 2
2
3
4 1
5 1
6 1 3
7
8 1
9 1 2
10
11 1
12 1
13 1
14 1
15 1 5
16
17 1 1
18
19 1 1
20

如您所见,“数据”中每组数据的长度是可变的,可以只有一行或任意数量的行。总和必须始终位于组的末尾。例如:“数据”列的第 4、5、6 行组的总和应位于“总和”列的第 6 行。

我们将不胜感激。

更新

通过实现 ansev 建议的方法 3 解决了问题。但是由于主程序的变化,每个 block 的总和现在需要在每个 block 的开头(如果 block 有多于一行)。然后我使用 df = df.iloc[::-1] 指令两次以反转列并再次恢复正常。非常感谢!!!!!!

df = df.iloc[::-1]
blocks = df['Data'].isnull().cumsum()
m = blocks.duplicated(keep='last')
df['Sum'] = df.groupby(blocks)['Data'].cumsum().mask(m)
df = df.iloc[::-1]

print(df)

Data Sum
0 1.0 2.0
1 1.0 NaN
2 NaN NaN
3 NaN NaN
4 1.0 3.0
5 1.0 NaN
6 1.0 NaN
7 NaN NaN
8 1.0 2.0
9 1.0 NaN
10 NaN NaN
11 1.0 5.0
12 1.0 NaN
13 1.0 NaN
14 1.0 NaN
15 1.0 NaN
16 NaN NaN
17 1.0 1.0
18 NaN NaN
19 1.0 1.0
20 NaN NaN

最佳答案

我们可以使用 GroupBy.cumsum :

# if you need replace blanks
#df = df.replace(r'^\s*$', np.nan, regex=True)
s = df['Data'].isnull()
df['sum'] = df.groupby(s.cumsum())['Data'].cumsum().where((~s) & (s.shift(-1)))
print(df)
index Data sum
0 0 1.0 NaN
1 1 1.0 2.0
2 2 NaN NaN
3 3 NaN NaN
4 4 1.0 NaN
5 5 1.0 NaN
6 6 1.0 3.0
7 7 NaN NaN
8 8 1.0 NaN
9 9 1.0 2.0
10 10 NaN NaN
11 11 1.0 NaN
12 12 1.0 NaN
13 13 1.0 NaN
14 14 1.0 NaN
15 15 1.0 5.0
16 16 NaN NaN
17 17 1.0 1.0
18 18 NaN NaN
19 19 1.0 1.0
20 20 NaN NaN

方法二

#df = df.drop(columns='index') #if neccesary
g = df.reset_index().groupby(df['Data'].isnull().cumsum())
df['sum'] = g['Data'].cumsum().where(lambda x: x.index == g['index'].transform('idxmax'))

方法三

Series.duplicatedSeries.mask

blocks = df['Data'].isnull().cumsum()
m = blocks.duplicated(keep='last')
df['sum'] = df.groupby(blocks)['Data'].cumsum().mask(m)

如您所见,这些方法仅在屏蔽 sum 列中不需要的值的方式上有所不同。

我们也可以使用 .transform('sum') 代替 .cumsum()

示例数据框的性能

%%timeit
s = df['Data'].isnull()
df['sum'] = df.groupby(s.cumsum())['Data'].cumsum().where((~s) & (s.shift(-1)))
4.52 ms ± 901 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

%%timeit
g = df.reset_index().groupby(df['Data'].isnull().cumsum())
df['sum'] = g['Data'].cumsum().where(lambda x: x.index == g['index'].transform('idxmax'))
8.52 ms ± 1.45 ms per loop (mean ± std. dev. of 7 runs, 100 loops each)

%%timeit
blocks = df['Data'].isnull().cumsum()
m = blocks.duplicated(keep='last')
df['sum'] = df.groupby(blocks)['Data'].cumsum().mask(m)
3.02 ms ± 172 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

关于python-3.x - 如何将 Pandas 列中的变量范围与另一列相加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62615666/

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