You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将顶级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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:33:25