我的数据框如下
id log loc pos_evnts neg_evnts As non_As pos_wrds neg_wrds As/Ac
A c City 8 0 48 0 0 0 1
A d City 2 6 0 180 4 10 0
A e City 0 22 87 0 0 0 1
A f City 8 0 35 0 0 0 1
A g City 8 2 42 0 0 0 1
A h City 4 4 0 115 4 2 0
A i City 2 0 32 0 0 0 1
B j Hill 3 0 24 0 0 0 1
B k City 6 8 116 0 0 2 1
B l City 2 4 200 0 0 2 1
C m City 2 0 40 0 0 0 0
C n Hill 5 0 1 0 2 0 0
C o City 5 0 7 0 0 5 1
如您所见,As/Ac
列中有零 (0)。
我想要做的是,当我们有一个零时,将零行的值添加到下一个 1 行。预期结果如下所示。
此处“零”行的值已添加到其下方的最衣柜 1 行,但“零”行本身并未更改。
id log loc pos_evnts neg_evnts As non_As pos_wrds neg_wrds As/Ac
A c City 8 0 48 0 0 0 1
A d City 2 6 0 180 4 10 0
A e City 2 28 87 180 4 10 1
A f City 8 0 35 0 0 0 1
A g City 8 2 42 0 0 0 1
A h City 4 4 0 115 4 2 0
A i City 6 4 32 115 4 2 1
B j Hill 3 0 24 0 0 0 1
B k City 6 8 116 0 0 2 1
B l City 2 4 200 0 0 2 1
C m City 2 0 40 0 0 0 0
C n Hill 5 0 1 0 2 0 0
C o City 12 0 48 0 5 5 1
或
这里“零”行的值添加到下面最接近的第 1 行,并且“零”行本身也使用新值进行更新,列 As/Ac 除外。 我希望 As/Ac 保持不变,因为稍后我将删除零行。
id log loc pos_evnts neg_evnts As non_As pos_wrds neg_wrds As/Ac
A c City 8 0 48 0 0 0 1
A d City 2 28 87 180 4 10 0
A e City 2 28 87 180 4 10 1
A f City 8 0 35 0 0 0 1
A g City 8 2 42 0 0 0 1
A h City 6 4 32 115 4 2 0
A i City 6 4 32 115 4 2 1
B j Hill 3 0 24 0 0 0 1
B k City 6 8 116 0 0 2 1
B l City 2 4 200 0 0 2 1
C m City 12 0 48 0 5 5 0
C n Hill 12 0 48 0 5 5 0
C o City 12 0 48 0 5 5 1
我尝试了df['As/Ac'].shift(fill_value=0).shift(-1).cumsum()
,它给出了组',其中零后面跟着一个,但是我我无法继续进行(对它们求和),因为我需要保留前 3 列并且它们是不同的。
我也尝试了以下方法,但出现错误。
df['validheads'] = df['As/Ac'].shift(fill_value=0).shift(-1).cumsum()
df.iloc[:,3:].groupby(['validheads'],as_index=False).sum()
最佳答案
您可以反向求和(颠倒 As/Ac
列后的求和)以及该列上的组,然后使用 .agg
聚合值
df.groupby(df.loc[::-1, 'As/Ac'].cumsum()[::-1]).agg({'id': 'last',
'log': 'last',
'loc': 'last',
'pos_evnts':'sum',
'neg_evnts':'sum',
'As':'sum',
'non_As':'sum',
'pos_wrds':'sum',
'neg_wrds':'sum',
'As/Ac': 'last'}).sort_index(ascending=False).reset_index(drop=True)
输出将是
id log loc pos_evnts neg_evnts As non_As pos_wrds neg_wrds As/Ac
0 A c City 8 0 48 0 0 0 1
1 A e City 2 28 87 180 4 10 1
2 A f City 8 0 35 0 0 0 1
3 A g City 8 2 42 0 0 0 1
4 A i City 6 4 32 115 4 2 1
5 B j Hill 3 0 24 0 0 0 1
6 B k City 6 8 116 0 0 2 1
7 B l City 2 4 200 0 0 2 1
8 C o City 12 0 48 0 2 5 1
关于python - 根据条件将某些行的值与另一个最近的行相加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59367908/