基于自定义可能值列表的Groupby数据帧

2024-09-27 19:17:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我想在两列中按值分组。我知道列中所有可能的值。在某些数据示例中,a列中的某些值不存在。我仍然希望groupby的输出表示组的len为零

          s      a  
0  Michaels     FS
1  Michaels     FS
2  Michaels    fds
3  Michaels   fnfe
4  Rogers       FS
5  Rogers      fds
6  Rogers      fds
7  Rogers      ssn

我想按s和a分组

df.groupby(by=["s", "a"]).size()

如果您查看数据样本,则Michaels和Rogers的fnfe和ssn均不存在。因此,Michaels ssn和Rogers fnfe将没有输出

我找到了一个解决这个问题的方法:

df.groupby(by=[“s”,“a”]).size().unstack().fillna(0.stack())

但后来我发现有一种可能性,a的几个值都不在这两个组中,但我仍然将它们放在输出中,它们的值设置为零。s列没有此类要求

假设“a”列“adg”有另一个值,这在任何示例中都不存在。所需的输出将是:

s         a   
Michaels  FS      2
          fds     1
          fnfe    1
          ssn     0
          adg     0
Rogers    FS      1
          fds     2
          ssn     1
          fnfe    0
          adg     0

Tags: 数据示例dfsizebylenfsssn
1条回答
网友
1楼 · 发布于 2024-09-27 19:17:28

^{}一起使用与^{}一起使用,并向具有唯一值的列表中添加值:

out = df.groupby(by=["s", "a"]).size()

s = df['s'].unique()
a = df['a'].unique().tolist() + ['adg']

out = out.reindex(pd.MultiIndex.from_product([s, a], names=['s','a']), fill_value=0)

print (out)
s         a   
Michaels  FS      2
          fds     1
          fnfe    1
          ssn     0
          adg     0
Rogers    FS      1
          fds     2
          fnfe    0
          ssn     1
          adg     0
dtype: int64

您的解决方案:

a = df['a'].unique().tolist() + ['adg']

out = (df.groupby(by=["s", "a"]).size()
         .unstack(fill_value=0)
         .reindex(a, fill_value=0, axis=1)
         .stack())

print (out)
s         a   
Michaels  FS      2
          fds     1
          fnfe    1
          ssn     0
          adg     0
Rogers    FS      1
          fds     2
          fnfe    0
          ssn     1
          adg     0
dtype: int64

另一个想法是使用Categorical

df['a'] = pd.Categorical(df['a'], categories=df['a'].unique().tolist() + ['adg'])

out = df.groupby(by=["s", "a"]).size()
print (out)
s         a   
Michaels  FS      2
          fds     1
          fnfe    1
          ssn     0
          adg     0
Rogers    FS      1
          fds     2
          fnfe    0
          ssn     1
          adg     0
dtype: int64

相关问题 更多 >

    热门问题