Pandas 如何在不同列的值不变的情况下,将一列中连续行的所有值相加
我有一个df,其中一列包含连续数据,第二列包含分类数据。例如: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 = {"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中的稍后时间点重复。但是,我不想对同一类型的所有条件求和。只有那些是连续的。谢谢广皇!!成功了!大家好,广黄。这是一个很好的解决方案。我有一个问题接近它,但有点不同,请你看一看:谢谢光环!!成功了!大家好,广黄。这是一个很好的解决方案。我有一个问题接近它,但有点不同,请你看看: