【问题标题】:How to add all values of consecutive rows in one column while values of different column are unchanged如何在不同列的值不变的情况下在一列中添加连续行的所有值
【发布时间】:2019-11-15 12:50:17
【问题描述】:

我有一个 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'],其中每一行的值是从同一行一直到“类别”更改的上一行的“数据”之和。需要注意的重要一点是,类别更改之前的行数在整个 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')

【问题讨论】:

  • 为什么第 8 行的总和没有变化?
  • 好问题!因为类别发生了变化,所以它现在只对第 8 行和第 9 行求和。不过,我明白这如何使示例令人困惑。我刚刚编辑了示例以消除这种混淆。
  • 好像你是从下往上总结的。第 9 行 + 第 8 行 = 4,即第 8 行的总和。但是由于类别从 A 更改为 B,whydoes 在第 8 行没有重置。但它确实在第 2 行重置。
  • 我明白你在说什么。我不清楚这些值是如何相加的。在这表示的数据集中,“B”的类别标签在技术上意味着新条件的第一行。因此,一个“B”和下一个“B”上方的行之间的所有行都来自相同的条件。而且,我正在尝试为每个条件计算所描述的操作。因此,第 0-2 行是一种条件,第 3-7 行是一种条件,第 8-9 行是第三种条件,一些条件在 df 中的稍后时间点重复。但是,我不想总结所有相同类型的条件。只有那些是连续的。

标签: pandas python-2.7


【解决方案1】:

你可以试试这个:

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多