Pandas - 使用 pivot_table 聚合多个列
Pandas - aggregate multiple columns with pivot_table
我有这样一个数据框:
import pandas as pd
import numpy as np
df = pd.DataFrame({"ind0": list("QQQWWWW"), "ind1": list("RRRRSSS"), "vals": range(7), "cols": list("XXYXXYY")})
print(df)
输出:
ind0 ind1 vals cols
0 Q R 0 X
1 Q R 1 X
2 Q R 2 Y
3 W R 3 X
4 W S 4 X
5 W S 5 Y
6 W S 6 Y
我想在从 col
创建列时聚合值,所以我想到了使用 pivot_table
:
df_res = df.pivot_table(index=["ind0", "ind1"], columns="cols", values="vals", aggfunc=np.sum).fillna(0)
print(df_res)
这给了我:
cols X Y
ind0 ind1
Q R 1.0 2.0
W R 3.0 0.0
S 4.0 11.0
但是,我宁愿获得独立于 ind1
类别的总和,同时保留此列中的信息。因此,所需的输出将是:
cols X Y
ind0 ind1
Q R 1.0 2.0
W R,S 7.0 11.0
有没有办法为此使用 pivot_table
或 pivot
,或者我是否必须在第二步中聚合 ind1
?如果是后者,怎么办?
您可以 reset_index
of df_res
和 groupby
"ind0" 并使用 agg
,在列上使用不同的函数:join
ing 的唯一值“ind1”和sum
命名为“X”和“Y”。
out = df_res.reset_index().groupby('ind0').agg({'ind1': lambda x: ', '.join(x.unique()), 'X':'sum', 'Y':'sum'})
或者如果您有多个列需要执行相同的功能,您也可以使用字典理解:
funcs = {'ind1': lambda x: ', '.join(x.unique()), **{k:'sum' for k in ('X','Y')}}
out = df_res.reset_index().groupby('ind0').agg(funcs)
输出:
cols ind1 X Y
ind0
Q R 1.0 2.0
W R, S 7.0 11.0
我有这样一个数据框:
import pandas as pd
import numpy as np
df = pd.DataFrame({"ind0": list("QQQWWWW"), "ind1": list("RRRRSSS"), "vals": range(7), "cols": list("XXYXXYY")})
print(df)
输出:
ind0 ind1 vals cols
0 Q R 0 X
1 Q R 1 X
2 Q R 2 Y
3 W R 3 X
4 W S 4 X
5 W S 5 Y
6 W S 6 Y
我想在从 col
创建列时聚合值,所以我想到了使用 pivot_table
:
df_res = df.pivot_table(index=["ind0", "ind1"], columns="cols", values="vals", aggfunc=np.sum).fillna(0)
print(df_res)
这给了我:
cols X Y
ind0 ind1
Q R 1.0 2.0
W R 3.0 0.0
S 4.0 11.0
但是,我宁愿获得独立于 ind1
类别的总和,同时保留此列中的信息。因此,所需的输出将是:
cols X Y
ind0 ind1
Q R 1.0 2.0
W R,S 7.0 11.0
有没有办法为此使用 pivot_table
或 pivot
,或者我是否必须在第二步中聚合 ind1
?如果是后者,怎么办?
您可以 reset_index
of df_res
和 groupby
"ind0" 并使用 agg
,在列上使用不同的函数:join
ing 的唯一值“ind1”和sum
命名为“X”和“Y”。
out = df_res.reset_index().groupby('ind0').agg({'ind1': lambda x: ', '.join(x.unique()), 'X':'sum', 'Y':'sum'})
或者如果您有多个列需要执行相同的功能,您也可以使用字典理解:
funcs = {'ind1': lambda x: ', '.join(x.unique()), **{k:'sum' for k in ('X','Y')}}
out = df_res.reset_index().groupby('ind0').agg(funcs)
输出:
cols ind1 X Y
ind0
Q R 1.0 2.0
W R, S 7.0 11.0