熊猫:带有垃圾箱的分层分组

时间:2020-04-22 16:20:54

标签: python pandas pandas-groupby

我想通过按层次划分维度并通过某种聚合/表示来表示bin,从而在pandas数据框中聚合数据。 以下列方式尝试时,会引发异常,指示索引重叠的问题。

import pandas as pd

df = pd.DataFrame({
   'A': [1,1,2,2,3,3,4,4],
   'B': [5,7,5,6,7,7,6,7],
   'C': [1,1,1,1,1,1,1,1]
})

A_grouped = pd.cut(df['A'], bins=2) 
# groups: (0.997, 2.5], (2.5, 4.0]

B_grouped = df.groupby([A_grouped])['B'].apply(pd.cut, bins=2)
# groups: (0.997, 2.5]: (4.998, 6.0], (6.0, 7.0]
#         (2.5, 4.0]: (5.999, 6.5], (6.5, 7.0]

df_agg = df.groupby([A_grouped, B_grouped], as_index=False).agg(**{ 
        'A': ('A', 'min'), 
        'B': ('B', 'mean'), 
        'C': ('C', 'median'),
    })
# raises exception: cannot handle overlapping indices; use IntervalIndex.get_indexer_non_unique

print(df_agg)

# expected output
# A, B, C
# 1, 5.333, 1
# 1, 7, 1
# 3, 6, 1
# 3, 7, 1

有什么想法要实现吗?

1 个答案:

答案 0 :(得分:2)

似乎pandas在多个级别上存在间隔时创建MultiIndex时遇到问题。由于您的输出不关心组,因此在labels=False时指定pd.cut即可进行分组,因为分组键是简单的整数。

A_grouped = pd.cut(df['A'], bins=2, labels=False) 
B_grouped = df.groupby([A_grouped])['B'].apply(pd.cut, bins=2, labels=False)

df_agg = (df.groupby([A_grouped, B_grouped], as_index=False)
             .agg(**{'A': ('A', 'min'), 
                     'B': ('B', 'mean'), 
                     'C': ('C', 'median')}))

#   A         B  C
#0  1  5.333333  1
#1  1  7.000000  1
#2  4  6.000000  1    # <- Your expected A was wrong. 
#3  3  7.000000  1