我需要对 pandas 数据框中的多个列进行连续的分组。我找到了有关如何对单列进行连续分组的答案,但我不确定如何将其扩展到多列。
例如,我的数据如下:
Time Object Status
1 A On
2 A Off
3 A On
4 B On
5 B On
我想对具有相同对象和状态的连续观察进行计数。
Object Status Duration
1 A On 1
2 A Off 1
3 A On 1 ,
4 B On 2
谢谢
最佳答案
要添加“连续性”条件,请将每一行与其后续行进行比较。 当它们不相等时,我们希望开始一个新组:
mask = (df[['Object','Status']] != df[['Object','Status']].shift(1)).any(axis=1)
# 0 True
# 1 True
# 2 True
# 3 True
# 4 False
# dtype: bool
group = mask.cumsum()
# 0 1
# 1 2
# 2 3
# 3 4
# 4 4
# dtype: int64
现在,您可以按 group
、Object
和 Status
对 df
进行分组,并按 count 进行聚合
:
df.groupby([group, df['Object'], df['Status']], as_index=False).agg('count')
# Object Status Time
# 0 A On 1
# 1 A Off 1
# 2 A On 1
# 3 B On 2
import pandas as pd
df = pd.DataFrame({'Object': ['A', 'A', 'A', 'B', 'B'],
'Status': ['On', 'Off', 'On', 'On', 'On'],
'Time': [1, 2, 3, 4, 5]})
mask = (df[['Object','Status']] != df[['Object','Status']].shift(1)).any(axis=1)
group = mask.cumsum()
result = df.groupby([group, df['Object'], df['Status']], as_index=False).agg('count')
result = result.rename(columns={'Time':'Duration'})
print(result)
产量
Object Status Duration
0 A On 1
1 A Off 1
2 A On 1
3 B On 2
关于Python Pandas 按连续多列分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49683143/