我有一个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')
答案 0 :(得分:0)
您可以尝试以下方法:
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