python中两个变量的表函数

2024-04-25 07:10:30 发布

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

我有这样一个数据帧。在

c_name      p_name    
  A           X
  B           Y
  B           A1
  C           ZX
  D           G4
  D           H9

我想要每个c_名字和每个p_名字的频率。 我通过使用

^{pr2}$

但是在python中如果我申请 pd.crosstab(df1['c_name'],df1['p_name'])它给出了结果,但格式不正确。在

我的期望是:

c_name      p_name    Freq
  A           X        1
  B           X        0
  B           X        0
  C           X        0
  D           X        0
  D           X        0
  A           Y        0
  B           Y        1
  B           Y        0
  C           Y        0
  D           Y        0
  D           Y        0  ..........so on.

提前谢谢。在


Tags: 数据namesoa1格式名字频率pd
2条回答
pd.crosstab(df['c_name'], df['p_name']).stack().reset_index(name='Freq')

这将提供:

^{pr2}$

使用^{}size的解决方案,如果还需要缺少值,请添加^{},并用0替换它们:

mux = pd.MultiIndex.from_product([df1['c_name'], df1['p_name']], names=['c_name','p_name'])
df1 = df1.groupby(['c_name','p_name']).size()
         .reindex(mux, fill_value=0).reset_index(name='Freq')

^{pr2}$

计时

解决方案更快,因为没有stack

In [197]: %timeit pd.crosstab(df1['c_name'], df1['p_name']).stack().reset_index(name='Freq')
100 loops, best of 3: 6.74 ms per loop

In [198]: %timeit  df1.groupby(['c_name','p_name']).size().reindex(pd.MultiIndex.from_product([df1['c_name'], df1['p_name']], names=['c_name','p_name']), fill_value=0).reset_index(name='Freq')
100 loops, best of 3: 3.12 ms per loop

相关问题 更多 >