Pandas 如何在不同列的值不变的情况下,将一列中连续行的所有值相加

Pandas 如何在不同列的值不变的情况下,将一列中连续行的所有值相加,pandas,python-2.7,Pandas,Python 2.7,我有一个df,其中一列包含连续数据,第二列包含分类数据。例如: df = {"data": [0, 1, 3, 2, 6, 0, 9, 5, 1, 3], "category": ["A","A","A","B","A","A","A","A","B","A"]} df = pd.DataFrame(df) In []: df Out[]: data category 0 0 A 1 1 A 2 3

我有一个df,其中一列包含连续数据,第二列包含分类数据。例如:

df = {"data": [0, 1, 3, 2, 6, 0, 9, 5, 1, 3], 
    "category": ["A","A","A","B","A","A","A","A","B","A"]} 

df = pd.DataFrame(df)

In []: df
Out[]: data    category    
0       0         A
1       1         A
2       3         A
3       2         B
4       6         A
5       0         A
6       9         A
7       5         A
8       1         B
9       3         A
我想创建一个新列['new_col'],其中每一行的值都是从同一行一直到上面“category”更改的行的“data”的总和。需要注意的是,类别更改前的行数在整个df中并不一致。例如,一旦执行计算,上述df将导致:

In []: df
Out[]: data    category  new_col  
0       0         A         4
1       1         A         4
2       3         A         3
3       2         B         22
4       6         A         20
5       0         A         14
6       9         A         14
7       5         A         5
8       1         B         4
9       3         A         3
我已经找到了很多关于列中所有行的值求和的答案。但是,我不太明白如何迭代所有行并执行上面描述的计算类型。我觉得这应该是一个简单的答案,但到目前为止我还没有任何运气

我一开始甚至试图弄清楚,只有在类别相同的情况下,如何添加一行及其下的行。但是,我没有运气。而且,我对这一切都是比较陌生的,所以我确信我甚至还没有接近正确的轨道。例如:

for index, row in df.iterrows():
    empty_list = []
    if row['category'] == A:
        if row.category.shift(-1) == A:
            num_add = row.data + row.data.shift(-1)
            empty_list.append(num_add)

data_set = pd.concat([data_set, empty_list], axis=1, join='inner')
您可以尝试以下方法:

df['new_col'] = (df.groupby(df['category'].eq('B').cumsum())
                   ['data'].apply(lambda x: (x[::-1].cumsum())[::-1] )
                )
其中:

   data category  new_col
0     0        A        4
1     1        A        4
2     3        A        3
3     2        B       22
4     6        A       20
5     0        A       14
6     9        A       14
7     5        A        5
8     1        B        4
9     3        A        3
您可以尝试以下方法:

df['new_col'] = (df.groupby(df['category'].eq('B').cumsum())
                   ['data'].apply(lambda x: (x[::-1].cumsum())[::-1] )
                )
其中:

   data category  new_col
0     0        A        4
1     1        A        4
2     3        A        3
3     2        B       22
4     6        A       20
5     0        A       14
6     9        A       14
7     5        A        5
8     1        B        4
9     3        A        3

为什么第8行的总数不变?好问题!因为类别改变了,现在只对第8行和第9行求和。我知道这会让这个例子很混乱。我刚刚编辑了这个例子来消除这种混乱。看起来你是在自下而上总结。第9行+第8行=4,这是第8行中的总和。但是whydoes没有在第8行重置,因为类别从A更改为B。但是它在第2行重置。我明白你的意思。我不清楚这些值是如何求和的。在表示的数据集中,“B”类别标签在技术上表示新条件的第一行。因此,一个“B”和下一个“B”上方的行之间的所有行都来自相同的条件。我试图计算每个条件下所描述的运算。因此,第0-2行是一个条件,第3-7行是一个条件,第8-9行是第三个条件。一些条件在df中的稍后时间点重复。但是,我不想对同一类型的所有条件求和。只有那些相邻的。为什么第8行的和不改变?好问题!因为类别改变了,现在只对第8行和第9行求和。我知道这会让这个例子很混乱。我刚刚编辑了这个例子来消除这种混乱。看起来你是在自下而上总结。第9行+第8行=4,这是第8行中的总和。但是whydoes没有在第8行重置,因为类别从A更改为B。但是它在第2行重置。我明白你的意思。我不清楚这些值是如何求和的。在表示的数据集中,“B”类别标签在技术上表示新条件的第一行。因此,一个“B”和下一个“B”上方的行之间的所有行都来自相同的条件。我试图计算每个条件下所描述的运算。因此,第0-2行是一个条件,第3-7行是一个条件,第8-9行是第三个条件。一些条件在df中的稍后时间点重复。但是,我不想对同一类型的所有条件求和。只有那些是连续的。谢谢广皇!!成功了!大家好,广黄。这是一个很好的解决方案。我有一个问题接近它,但有点不同,请你看一看:谢谢光环!!成功了!大家好,广黄。这是一个很好的解决方案。我有一个问题接近它,但有点不同,请你看看: