我有一个5列的数据框。 年,月,A1,A2和A3。
我需要一个基于年份和月份的汇总表。
A1应该是带有条件的计数。 A2应该是一个和。 A3应该是一个计数。
我尝试做一个透视图,但熊猫透视图似乎只选择一列作为值字段。
我尝试分别获取列的计数和总和,但是我需要一个汇总表
df1=df.loc[(df['A1'] == 'Y') | (df['A2'] == 'DY')].count()
df2=df['A2'].sum()
df3=df['A3'].count()
答案 0 :(得分:0)
因为您没有提供我必须创建自己的DF的代码,所以我希望我做对了,这是我的解决方案:
np.random.seed(10)
data = {
'Year': np.random.choice(["2015", "2016"], (10)),
'Month': np.random.choice(["Jan", "September"], (10)),
'A1': np.random.choice(["Y", "X"], (10)),
'A2': np.random.choice(["DY", "DX"], (10)),
'A3': np.random.choice(["A", "B"], (10)),
}
df = pd.DataFrame(data).sort_values(["Year", "Month"])
Year Month A1 A2 A3
4 2015 Jan X DY B
7 2015 Jan Y DY A
2 2015 September Y DY B
0 2016 Jan Y DY B
3 2016 Jan Y DY A
6 2016 Jan Y DX A
8 2016 Jan X DX A
9 2016 Jan Y DX B
1 2016 September X DX B
5 2016 September X DX A
groups = df.groupby(["Year", "Month"])
def specialSum(group):
return ((group['A1'] == 'Y') | (group['A2'] == 'DY')).sum()
groups = df.groupby(["Year", "Month"])
pd.concat([groups.apply(lambda group: specialSum(group)).rename('A1'),
groups.agg({'A2': 'sum', 'A3': 'count'})],
axis=1)
输出:
A1 A2 A3
Year Month
2015 Jan 2 DYDY 2
September 1 DY 1
2016 Jan 4 DYDYDXDXDX 5
September 0 DXDX 2
希望它有帮助,如果您有任何问题要发表评论,或者数据不具有代表性,请更新您的问题,以便我改善自己的答案,例如,我认为A2的总和不是您想要的如果A2包含字符串,或者我的数据与您的数据不一样。
所用功能的文档:
Groupby:根据值(可以是序列,映射值等)对行进行分组
Groupby.apply:在组上应用功能。
Groupby.agg:通过指定的agg函数聚合组,可以由dict来为differents列指定不同的agg函数。
Concat:沿着指定的轴连接DataFrame。