【问题标题】:Pandas Crosstab with frequency, row percentage and col percentage on the same outputPandas 交叉表在同一输出上具有频率、行百分比和列百分比
【发布时间】:2016-04-01 19:26:34
【问题描述】:

我正在尝试在 Stata 中复制非常有用的 tabulate twoway 函数,在同一输出中,您可以看到 频率、相应的 行百分比 和相应的数据中两个分类变量的每个可能组合的列百分比

也就是说,结果表中的每个单元格都包含与上述数字对应的三个堆叠值。

Stata 中的示例输出:这是单个变量 汽车类型 的表格,其中,在数据中,我有 52 个观察值,其中汽车类型为 domestic,22 个观察值其中汽车类型等于foreign.

 Domestic   Foreign  Total

 52         22       74 
 70.27      29.73    100.00 
 100.00     100.00   100.00 

在 Pandas 中可以做到这一点吗?示例:

df = pd.DataFrame({'A' : ['one', 'one', 'two', 'three'] * 6,
                   'B' : ['A', 'B', 'C'] * 8,
                   'C' : ['foo', 'foo', 'foo', 'bar', 'bar', 'bar'] * 4,
                   'D' : np.random.randn(24),
                   'E' : np.random.randn(24)})

可以结合的东西

pd.crosstab(df.A,df.B)

pd.crosstab(df.A, df.B).apply(lambda r: r/r.sum(), axis=1)

pd.crosstab(df.A, df.B).apply(lambda r: r/r.sum(), axis=0)

在相同的输出上。你怎么看?我正在考虑aggfunc,但在这里我需要获取整个数据框,而不仅仅是一个系列......

谢谢!

【问题讨论】:

    标签: python pandas stata


    【解决方案1】:

    考虑使用交叉表的margins 将所有三个连接成一个df。下面使用您的示例:

    newdf = pd.concat([pd.crosstab(df.A, df.B, margins=True),
                       pd.crosstab(df.A, df.B).apply(lambda r: r/r.sum(), axis=0),                   
                       pd.crosstab(df.A, df.B).apply(lambda r: r/r.sum(), axis=1)])
    
    newdf = newdf.loc[['one','two','three','All']]              # RE-ORDER INDEX VALUES                                 
    newdf = newdf[['A', 'B', 'C', 'All']]                       # RE-ORDER COLUMNS 
    newdf['All'] = np.where(pd.isnull(newdf['All'])   &         # ROW PERCENTAGES SUM
                            (newdf['A'] + newdf['B'] + newdf['C']==1),
                            1, newdf['All'])
    print(newdf)
    #              A         B         C   All
    # A                                        
    # one    4.000000  4.000000  4.000000  12.0
    # one    0.500000  0.500000  0.500000   NaN
    # one    0.333333  0.333333  0.333333   1.0
    # two    2.000000  2.000000  2.000000   6.0
    # two    0.250000  0.250000  0.250000   NaN
    # two    0.333333  0.333333  0.333333   1.0
    # three  2.000000  2.000000  2.000000   6.0
    # three  0.250000  0.250000  0.250000   NaN
    # three  0.333333  0.333333  0.333333   1.0
    # All    8.000000  8.000000  8.000000  24.0
    

    【讨论】:

      猜你喜欢
      • 2019-09-29
      • 2020-11-30
      • 1970-01-01
      • 2022-01-21
      • 1970-01-01
      • 2020-10-17
      • 1970-01-01
      • 2019-08-16
      • 1970-01-01
      相关资源
      最近更新 更多