【问题标题】:Table function for two variable in pythonpython中两个变量的表函数
【发布时间】:2017-09-09 09:50:33
【问题描述】:

我有一个这样的数据框。

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

我想要每个 c_name 和每个 p_name 的频率。 我通过使用

在 R 中获得正确的输出
data.frame(table(df1$c_name,df1$p_name))

但是如果我申请的话,在 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.

提前致谢。

【问题讨论】:

  • 交叉制表应该为您提供每组的频率,这可能不是您想要的。你试过 pandas.Series.value_counts 吗?
  • 您是否也在寻找 R(或仅在 Python)中的解决方案?

标签: python pandas


【解决方案1】:
pd.crosstab(df['c_name'], df['p_name']).stack().reset_index(name='Freq')

这将给出:

   c_name p_name  Freq
0       A     A1     0
1       A     G4     0
2       A     H9     0
3       A      X     1
4       A      Y     0
5       A     ZX     0
6       B     A1     1
7       B     G4     0
8       B     H9     0
9       B      X     0
10      B      Y     1
11      B     ZX     0
12      C     A1     0
13      C     G4     0
14      C     H9     0
15      C      X     0
16      C      Y     0
17      C     ZX     1
18      D     A1     0
19      D     G4     1
20      D     H9     1
21      D      X     0
22      D      Y     0
23      D     ZX     0

【讨论】:

    【解决方案2】:

    使用groupbysize 的解决方案,如果需要还缺少值添加reindex 并用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')
    

    print (df1)
       c_name p_name  Freq
    0       A      X     1
    1       A      Y     0
    2       A     A1     0
    3       A     ZX     0
    4       A     G4     0
    5       A     H9     0
    6       B      X     0
    7       B      Y     1
    8       B     A1     1
    9       B     ZX     0
    10      B     G4     0
    11      B     H9     0
    12      B      X     0
    13      B      Y     1
    14      B     A1     1
    15      B     ZX     0
    16      B     G4     0
    17      B     H9     0
    18      C      X     0
    19      C      Y     0
    20      C     A1     0
    21      C     ZX     1
    22      C     G4     0
    23      C     H9     0
    24      D      X     0
    25      D      Y     0
    26      D     A1     0
    27      D     ZX     0
    28      D     G4     1
    29      D     H9     1
    30      D      X     0
    31      D      Y     0
    32      D     A1     0
    33      D     ZX     0
    34      D     G4     1
    35      D     H9     1
    

    时间安排

    解决方案更快,因为没有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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-11
      • 2017-09-20
      相关资源
      最近更新 更多