Python Pandas 按连续多列分组

标签 python pandas group-by pandas-groupby

我需要对 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

现在,您可以按 groupObjectStatusdf 进行分组,并按 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/

相关文章:

python - 在 Pandas 中为两列和单个数据行创建 DataFrame

python - 尝试将数据插入 postgresql 时出现语法错误

python-3.x - 如何删除 Matplotlib 中的空 x 轴坐标

python - 使用 openpyxl 在 python 中对齐单元格的正确方法

python - 从数组中提取元素时出错。 Python

python - 调试 tensorflow 单元测试

Mysql分组与计数

mysql - UNION 生成重复行

mysql - 如何制定查询来显示一个人参加的所有类(class)

python - 在一行和多行上写东西的区别