我想通过按层次划分维度并通过某种聚合/表示来表示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
有什么想法要实现吗?
答案 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