如何将顶级buyer_code列表传入pandas Series筛选对应交易数据?
如何用筛选出的顶级买家列表过滤Pandas Series数据
嘿,你的需求逻辑很清晰——先找出交易贡献最高的买家,再从分组后的Series里提取这些买家的交易记录对吧?咱们一步步来解决:
1. 构建并预处理DataFrame
先确认你现有的基础代码(我调整了小细节让它更严谨):
import pandas as pd # 初始化数据 d = {'no': ['1','2','3','4','5','6','7','8','9'], 'buyer_code': ['Buy1', 'Buy2', 'Buy3', 'Buy1', 'Buy2', 'Buy2', 'Buy2', 'Buy1', 'Buy3'], 'dollar_amount': ['200.25', '350.00', '120.00', '400.50', '1231.25', '700.00', '350.00', '200.25', '2340.00'], 'date': ['22-01-2010','14-03-2010','17-06-2010','13-04-2011','17-05-2011','28-01-2012','23-07-2012','25-10-2012','25-12-2012']} df = pd.DataFrame(data=d) # 转换金额为浮点型并设置显示格式 pd.options.display.float_format = '{:,.4f}'.format df['dollar_amount'] = df['dollar_amount'].astype(float)
2. 筛选顶级买家(优化版)
你通过聚合计算交易贡献值的思路没问题,这里把代码简化得更易读:
# 按买家聚合计算平均金额和交易次数 xx = df.groupby('buyer_code').agg( avg_amount=('dollar_amount', 'mean'), transaction_count=('no', 'size') ) # 计算交易贡献值(次数×平均金额) xx['frqAmnt'] = xx['transaction_count'] * xx['avg_amount'] # 取top2买家 top_xx = xx['frqAmnt'].nlargest(2)
此时top_xx的索引就是我们需要的顶级买家列表:['Buy2', 'Buy3']
3. 按买家+日期分组(简化版)
你原代码里的groupby('buyer_code').head(all)其实是多余的,value_counts()已经会为每个买家的唯一日期统计次数(这里每个日期都是唯一的,所以次数都是1),简化后:
zz = df.groupby(['buyer_code'])['date'].value_counts()
4. 用顶级买家列表过滤zz
因为zz是**多级索引(MultiIndex)**的Series,第一级索引就是buyer_code,我们有两种简单的筛选方式:
方法一:直接用loc匹配索引
先提取顶级买家的列表:
top_buyers = top_xx.index.tolist()
然后筛选zz:
zz_filtered = zz.loc[top_buyers]
运行后得到的结果就是你要的:
buyer_code date Buy2 14-03-2010 1 17-05-2011 1 28-01-2012 1 23-07-2012 1 Buy3 17-06-2010 1 25-12-2012 1 Name: date, dtype: int64
方法二:转换成DataFrame后用isin筛选(更直观)
如果你对多级索引操作不太熟悉,可以先把zz转成DataFrame,再用isin过滤:
# 把Series转成DataFrame,新增列名count zz_df = zz.reset_index(name='count') # 筛选顶级买家的记录 zz_filtered_df = zz_df[zz_df['buyer_code'].isin(top_buyers)]
这种方式得到的是DataFrame格式,结果和上面完全一致,适合更直观的数据分析场景。
关于你最初的疑问:能不能把列表传入Series作为索引?
其实你不需要把列表变成Series的索引,而是用列表筛选已有的索引——上面的两种方法都是基于这个思路,直接用顶级买家列表匹配zz的buyer_code索引层级,就能快速过滤出目标数据。
内容的提问来源于stack exchange,提问作者el323
相关产品推荐
相关产品推荐

