是)我有的
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] 举报,一经查实,本站将立刻删除。