汇总分类栏的问题

时间:2019-11-03 08:03:22

标签: python pandas

在汇总多个包含分类列的列时,我在pandas 0.25.2中遇到了一个问题。

import pandas as pd

df = pd.DataFrame({
    "col1": [1, 3, 4, 1], 
    "col2": pd.Categorical(["b", "a", "c", "b"], categories=["a", "b", "c"], ordered=False), 
    "col3": [4, 5, 3, 2]
})
df_agg = df.groupby("col1").agg(
    col2=pd.NamedAgg("col2", "first"),
    col3_max=pd.NamedAgg("col3", "max")
)
print(df_agg)

输出:

  col2  col3_max
0    b       NaN
1    a       4.0
2    c       NaN
3  NaN       5.0
4  NaN       3.0

预期输出:

  col2  col3_max
1    b       4
3    a       5
4    c       3

该问题似乎是由于以下汇总类别列的行为引起的。

df_grouped_col2 = df.groupby("col1")["col2"].first()
print(type(df_grouped_col2))
print(df_grouped_col2)

输出:

<class 'pandas.core.arrays.categorical.Categorical'>
[b, a, c]
Categories (3, object): [a, b, c]

这是一个错误吗?如果是这样,是否有解决方法?

1 个答案:

答案 0 :(得分:4)

我认为它是bug,但可能的解决方案是将lambda函数与iat一起用于组的第一个值:

df_agg = df.groupby("col1").agg(
    col2=pd.NamedAgg("col2", lambda x: x.iat[0]),
    col3_max=pd.NamedAgg("col3", "max")
)
print(df_agg)
     col2  col3_max
col1               
1       b         4
3       a         5
4       c         3

df_grouped_col2 = df.groupby("col1")["col2"].agg(lambda x: x.iat[0])
print(type(df_grouped_col2))
<class 'pandas.core.series.Series'>

print(df_grouped_col2)
col1
1    b
3    a
4    c
Name: col2, dtype: object