【问题标题】:How to get pandas crosstab to sum up values for multiple columns?如何让熊猫交叉表汇总多列的值?
【发布时间】:2021-03-06 19:37:30
【问题描述】:

假设我们有一个像这样的表:

id    chr     val1     val2
...    A        2       10
...    B        4       20
...    A        3       30

...我们希望有一个像这样的列联表(按chr 分组,因此使用'A''B' 作为行索引,然后将val1 和@ 的值相加987654326@):

       val1    val2    total
A        5      40       45
B        4      20       24
total    9      60       69

我们怎样才能做到这一点?

pd.crosstab(index=df.chr, columns=["val1", "val2"]) 看起来很有希望,但它只是计算行数,而不是对值求和。

我也尝试过(无数次)手动提供值...

pd.crosstab(
  index=df.chr.unique(),
  columns=["val1", "val2"],
  values=[
    df.groupby("chr")["val1"],
    df.groupby("chr")["val2"]
  ],
  aggfunc=sum
)

...但这总是以形状不匹配而告终,当我尝试通过 NumPy 重塑时:

values=np.array([
  df.groupby("chr")["val1"].values,
  df.groupby("chr")["val2"].values
].reshape(-1, 2)

...crosstab 告诉我它需要 1 个值,而不是每行给出的两个值。

【问题讨论】:

    标签: python pandas crosstab contingency


    【解决方案1】:
    import pandas as pd
    
    df = pd.DataFrame({'chr': {0: 'A', 1: 'B', 2: 'A'},
     'val1': {0: 2, 1: 4, 2: 3},
     'val2': {0: 10, 1: 20, 2: 30}})
    # aggregate values by chr
    df = df.groupby('chr').sum().reset_index()
    df = df.set_index('chr')
    # Column Total
    df.loc['total', :] = df.sum()
    # Row total
    df['total'] = df.sum(axis=1)
    

    输出

           val1     val2    total
    chr         
    A       5.0     40.0    45.0
    B       4.0     20.0    24.0
    total   9.0     60.0    69.0
    

    【讨论】:

      【解决方案2】:

      你想要的是pivot_table

      table = pd.pivot_table(df, values=['val1','val2'], index=['char'], aggfunc=np.sum)
      table['total'] = table['val1'] + table['val2']
      

      【讨论】:

        猜你喜欢
        • 2021-04-09
        • 1970-01-01
        • 1970-01-01
        • 2018-05-08
        • 2021-02-19
        • 2017-06-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多