gpt4 book ai didi

python - 在 Pandas 中过滤多列 groupby 结果

转载 作者:行者123 更新时间:2023-11-28 20:38:06 25 4
gpt4 key购买 nike

使用 Pandas,我将如何过滤我的 Dataframe,以便只显示当天交易总数 > N 的日子?

import pandas as pd
data = [
["2017-01-01 00:00:01.012345", 'Jen', 1.01],
["2017-01-01 01:00:00.012345", 'Joe', 3.02],
["2017-02-01 00:00:00.012345", 'Jen', 2.02],
["2017-02-01 02:00:00.012345", 'Joe', 0.02],
["2017-03-01 03:00:00.012345", 'Jen', 3.02],
["2017-03-01 04:00:00.012345", 'Joe', 4.04],
["2017-03-01 05:00:01.012345", 'Jen', 5.01]]
df = pd.DataFrame({
'trx_time': list(zip(*data))[0],
'agent': list(zip(*data))[1],
'trx_amount': list(zip(*data))[2]})
df['day'] = df['trx_time'].apply(lambda x: pd.to_datetime(x).date())
grouped = df.groupby(['day', 'agent'])
by_day_df = grouped.aggregate('sum')\
.rename(columns = lambda x: 'day_tl_' + x)\
.join(pd.DataFrame(grouped.size(), columns=['trx_count']))
print (by_day_df)

输出:

day        agent                              
2017-01-01 Jen 1.01 1
Joe 3.02 1
2017-02-01 Jen 2.02 1
Joe 0.02 1
2017-03-01 Jen 8.03 2
Joe 4.04 1

因此,过滤后我不想显示 2017-02-01 的任何一行,因为当天的总数 < 3。

这可以用 .filter() 来完成吗?

最佳答案

  • 重要的部分是groupby索引的第一级并取列day_tl_trx_amount
  • 的总和
  • 然后我们需要过滤分组和求和的数据,只过滤总和大于或等于3
  • 的那些天数
  • 最后,我们使用这些天来过滤第一个数据框

找出总和 >= 3 的日子

idx = by_day_df.groupby(level='day')[['day_tl_trx_amount']].sum() \
.query('day_tl_trx_amount >= 3').index.tolist()

过滤第一个数据帧

by_day_df.loc[idx]

day_tl_trx_amount trx_count
day agent
2017-01-01 Jen 1.01 1
Joe 3.02 1
2017-03-01 Jen 8.03 2
Joe 4.04 1

使用 unstacksum 更优雅一点
我的首选解决方案

s = by_day_df.unstack().day_tl_trx_amount.sum(1).ge(3)
by_day_df.loc[s.index[s].tolist()]

day_tl_trx_amount trx_count
day agent
2017-01-01 Jen 1.01 1
Joe 3.02 1
2017-03-01 Jen 8.03 2
Joe 4.04 1

关于python - 在 Pandas 中过滤多列 groupby 结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41671964/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com