使用分类字符串对 pandas 数据框进行分组
Grouping a pandas dataframe with categorical strings
我有以下df
df = pd.DataFrame({'Cat':['tq','tb','ta','tb','ta','tq','tb','tq','ta'],
'col1':['a','a','a','b','b','c','c','c','a'],
'col2':['aa','aa','aa','aa','ba','ba','cc','cc','cc'],
'val':np.random.rand(9)})
我想创建以下排名:
df['Cat'] = pd.Categorical(df['Cat'],['tb','tq','ta'])
但是,当我尝试按总和分组时:
df2 = df.groupby(['col1','Cat','col2'])['val'].sum()
我最终得到 27 行 table,而不是我省略分类排名时所需的 8 行。
我了解到 27 是 ['col1','Cat','col2']
的唯一值的乘积。
我想知道如何通过而不是过滤掉 val != 0
的位置来防止组中的这些排列
您可以在 groupby
中使用 observed
参数
df2 = df.groupby(['col1','Cat','col2'], observed=True)['val'].sum()
df2
# col1 Cat col2
# a tq aa 0.422378
# tb aa 0.395679
# ta aa 0.407851
# cc 0.998086
# b tb aa 0.318188
# ta ba 0.861469
# c tq ba 0.333660
# cc 0.427609
# tb cc 0.415207
# Name: val, dtype: float64
我有以下df
df = pd.DataFrame({'Cat':['tq','tb','ta','tb','ta','tq','tb','tq','ta'],
'col1':['a','a','a','b','b','c','c','c','a'],
'col2':['aa','aa','aa','aa','ba','ba','cc','cc','cc'],
'val':np.random.rand(9)})
我想创建以下排名:
df['Cat'] = pd.Categorical(df['Cat'],['tb','tq','ta'])
但是,当我尝试按总和分组时:
df2 = df.groupby(['col1','Cat','col2'])['val'].sum()
我最终得到 27 行 table,而不是我省略分类排名时所需的 8 行。
我了解到 27 是 ['col1','Cat','col2']
的唯一值的乘积。
我想知道如何通过而不是过滤掉 val != 0
您可以在 groupby
observed
参数
df2 = df.groupby(['col1','Cat','col2'], observed=True)['val'].sum()
df2
# col1 Cat col2
# a tq aa 0.422378
# tb aa 0.395679
# ta aa 0.407851
# cc 0.998086
# b tb aa 0.318188
# ta ba 0.861469
# c tq ba 0.333660
# cc 0.427609
# tb cc 0.415207
# Name: val, dtype: float64