python - 根据条件将某些行的值与另一个最近的行相加

标签 python python-3.x pandas pandas-groupby

我的数据框如下

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/

相关文章:

python - pandas any 中 Axis 的定义

python - itertools.chain.from_iterable 适用于嵌套数字列表,但不适用于字符串列表?

python - 无法在朴素贝叶斯中训练模型

python - 如何设置 Pyglet 以在 Colab 中与 Manim 一起工作?

javascript - Cygwin 如何用于 python 编程?

python-3.x - 如何在没有默认 "sort"的情况下加入两个集合

python - 如何在 "map"函数调用中将参数传递给函数?

python - 可以向 .format() 方法添加换行符吗?

python - Pandas 根据列将两行合并为一行

python - 正则表达式中的字符串操作似乎有太多异常(exception)