如何获取pandas交叉表来汇总多列的值



假设我们有一个类似于的表

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

我们想要一个这样的列联表(按chr分组,因此使用'A''B'作为行索引,然后将val1val2的值相加(:

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告诉我,它需要一个值,而不是每行给定的两个值。

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

您想要的是pivot_table

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

最新更新