pandas 用两个不同类别的N个计数填充 Dataframe

sd2nnvve  于 2023-02-07  发布在  其他
关注(0)|答案(2)|浏览(133)

样本数据:

type1 = ['bunny','cow','pig','chicken','elephant']
type2 = ['flower','tree','grass']

data_type1 = np.random.choice(a = type1, p = [0.05,0.15,0.25,0.05,0.5], size=1000)
data_type2 = np.random.choice(a = type2, p = [0.25,0.25,0.50], size=1000)
data_value = stats.poisson.rvs(loc = 18, mu = 30, size = 1000)

df = pd.DataFrame({'type1':data_type1,'type2':data_type2,'data':data_value})

grp1 = pd.unique(df.type1.values)
grp1.sort()
grp2 = pd.unique(df.type2.values)
grp2.sort()
m_df = pd.DataFrame(index = grp1,columns=grp2)

给定一个df结构为“df”,我如何用每个类型组合的计数填充“m_df”。我想完成df.groupby(['type1','type2'])['data'].count(),但我不确定如何将其写入df,使其看起来更漂亮,更有用。
编辑:下面是一个简单的df,它也可以作为一个例子使用,期望的输出是每个类型组合的值的数量--当输入是df.groupby(['type1','type2'])['data'].count()时显示的确切输出,问题是如何将该输出表示为类似于m_df的 Dataframe 。

df = pd.DataFrame({'type1': ['bunny','cow','pig','chicken','elephant','cow','pig'],
           'data': [32,23,45,35,20,28,55],
           'type2':['female', 'male','male','male','male','female','female']})
j1dl9f46

j1dl9f461#

IIUC,使用value_counts(与groupby_count相同),然后使用unstack作为第二个索引级别:

>>> (df.value_counts(['type1', 'type2'])
       .unstack('type2', fill_value=0)
       .rename_axis(index=None, columns=None))

          female  male
bunny          1     0
chicken        0     1
cow            1     1
elephant       0     1
pig            1     1

您也可以使用pd.crosstabpivot_table

>>> (pd.crosstab(df['type1'], df['type2'], 1, aggfunc='count')
   .fillna(0).astype(int).rename_axis(index=None, columns=None))

>>> (df.assign(val=1).pivot_table('val', 'type1', 'type2', aggfunc=sum, fill_value=0)
   .rename_axis(index=None, columns=None))
p8ekf7hl

p8ekf7hl2#

因此,我使用了您提供的输入。
我不知道,你想在这里实现什么,但从我感觉你需要的是。
密码???

df_grp = df.groupby(['type1','type2'], as_index=False)['data'].count()

输出如下所示
Output

相关问题