gpt4 book ai didi

python - Pandas 数据框 : aggregate values within blocks of repeating IDs

转载 作者:行者123 更新时间:2023-12-05 02:53:34 25 4
gpt4 key购买 nike

给定一个包含 ID 列和相应值列的 DataFrame,我如何聚合(比方说求和)重复 ID block 中的值?

示例 DF:

import numpy as np
import pandas as pd

df = pd.DataFrame(
{'id': ['a', 'a', 'a', 'a', 'a', 'b', 'b', 'b', 'a', 'a', 'b', 'a', 'b', 'b', 'b'],
'v': np.ones(15)}
)

请注意,只有两个唯一 ID,因此简单的 groupby('id') 将不起作用。此外,ID 不会定期交替/重复。我想到的是重新创建索引,以表示已更改 ID 的 block :

# where id changes:
m = [True] + list(df['id'].values[:-1] != df['id'].values[1:])

# generate a new index from m:
idx, i = [], -1
for b in m:
if b:
i += 1
idx.append(i)

# set as index:
df = df.set_index(np.array(idx))

# now I can use groupby:
df.groupby(df.index)['v'].sum()
# 0 5.0
# 1 3.0
# 2 2.0
# 3 1.0
# 4 1.0
# 5 3.0

这种重新创建索引的感觉有点不是您在 pandas 中执行此操作的方式。我错过了什么?有更好的方法吗?

最佳答案

这里有必要创建助手 Series,将不等于 ne 的移位值与累积和进行比较,并传递给 groupby,对于 id 列可以在列表中一起传递,首先通过 reset_index(level=0, drop=True) 删除 MultiIndex 的第一级,然后将索引转换为列 id:

print (df['id'].ne(df['id'].shift()).cumsum())
0 1
1 1
2 1
3 1
4 1
5 2
6 2
7 2
8 3
9 3
10 4
11 5
12 6
13 6
14 6
Name: id, dtype: int32

df1 = (df.groupby([df['id'].ne(df['id'].shift()).cumsum(), 'id'])['v'].sum()
.reset_index(level=0, drop=True)
.reset_index())
print (df1)
id v
0 a 5.0
1 b 3.0
2 a 2.0
3 b 1.0
4 a 1.0
5 b 3.0

另一个想法是使用 GroupBy.agg用字典和聚合 idGroupBy.first :

df1 = (df.groupby(df['id'].ne(df['id'].shift()).cumsum(), as_index=False)
.agg({'id':'first', 'v':'sum'}))

关于python - Pandas 数据框 : aggregate values within blocks of repeating IDs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62167354/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com