具有多个值列的枢轴

时间:2019-08-27 04:13:05

标签: python pandas

我有一个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()

1 个答案:

答案 0 :(得分:0)

因为您没有提供我必须创建自己的DF的代码,所以我希望我做对了,这是我的解决方案:

  1. 数据:
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
  1. 按年份和月份分组:
groups = df.groupby(["Year", "Month"])
  1. 获取所需的汇总:
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。