微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python – Pandas:聚合后加入分组密钥

是)我有

我有一个像这样的熊猫框架:

df1 = pd.DataFrame({
    'date': ['31-05-2017', '31-05-2017', '31-05-2017', '31-05-2017', '01-06-2017', '01-06-2017'],
    'tag':     ['A', 'B', 'B', 'B', 'A', 'A'],
    'metric1': [0, 0, 0, 1, 1, 1],
    'metric2': [0, 1, 1, 0, 1, 0]
})


df2 = pd.DataFrame({
    'date': ['31-05-2017', '31-05-2017', '01-06-2017'],
    'tag':     ['A', 'B', 'A'],
    'metric3': [25, 3, 7,]
})

我想要的是

1)我想对每个日期和标签的组合求和度量和度量

2)计算metric_2中条目的百分比

3)将分组df1与df2合并,以便每个日期和标签都有metric_3

date       | tag | metric1_sum | metric2_sum | metric2_percentage| metric 3
-----------|-----|-------------|-------------|-------------------|---------
31-05-2017 | A   | 0           | 0           | 0                 | 25
31-05-2017 | B   | 1           | 2           | 0.667             | 3
01-06-2017 | A   | 1           | 0           | 0.5               | 7

尝试

(1)小组和总和工程

>>> g = df1.groupby(['date', 'tag']).agg(sum)
>>> g
                metric1  metric2
date       tag                  
01-06-2017 A          2        1
31-05-2017 A          0        0
           B          1        2

(2)计算百分比工作但是将其作为列添加不起作用

我使用方法posted here来计算百分比.

>>> g2 = df1.groupby(['date', 'tag']).agg({'metric2': 'sum'})
>>> g2.groupby(level=0).apply(lambda x: x/float(x.sum()))
                metric2
date       tag         
01-06-2017 A        1.0
31-05-2017 A        0.0
           B        1.0

但是,我现在如何将此分组指标2分配给我的组g或我的df1中的column2_percentage列?

(3)合并不成功

与该组合并显然不起作用:

>>> pd.merge(g, df2, how='left', on=['date', 'tag'])
KeyError: 'date'

然后,我如何将每个组的df1减少到一行,以便我可以将它与df2合并?

解决方法:

g有日期,标记为索引,而合并期望列,你需要在g上重置reset:

pd.merge(g.reset_index(), df2, how='left', on=['date', 'tag'])

或者指定left_index = True:

pd.merge(g, df2, how='left', left_index=True, right_on=['date', 'tag'])

两者都给出结果(列顺序略有不同):

#         date  tag  metric1  metric2   metric3
#0  01-06-2017    A        2        1         7
#1  31-05-2017    A        0        0        25
#2  31-05-2017    B        1        2         3

这是一个替代方案,可以减少一个联接:

(df1.groupby(['date', 'tag']).apply(
        lambda g: pd.Series({'metric1_sum': g.metric1.sum(), 
                             'metric2_sum': g.metric2.sum(), 
                             'metric2_percentage': g.metric2.mean()})   
# assumed here you have only 1 and 0 in metric 2 column if not use your own lambda function
    ).reset_index().merge(df2, how='left', on=['date', 'tag']))

#         date  tag  metric1_sum    metric2_percentage  metric2_sum metric3
#0  01-06-2017    A          2.0              0.500000         1.0        7
#1  31-05-2017    A          0.0              0.000000         0.0       25
#2  31-05-2017    B          1.0              0.666667         2.0        3

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐