假设我们有一个类似于的表
id chr val1 val2
... A 2 10
... B 4 20
... A 3 30
我们想要一个这样的列联表(按chr
分组,因此使用'A'
和'B'
作为行索引,然后将val1
和val2
的值相加(:
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']