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

如何在Pandas DataFrame中按特定条件使用.count()方法?

问题分析与解决方案

错误原因解析

  • 第一种写法报错DataFrame is not hashable:你在groupby()后使用[df[df['side']=='Buy']],这是试图将一个DataFrame对象作为列选择器,但groupby后的列选择仅支持字符串(列名),而DataFrame属于不可哈希的对象,因此触发该错误。
  • 第二种写法报错True is not a key:df['side']=='Sell'返回的是布尔值组成的Series,你将其放在[]中时,Python会把布尔值True当作列名去查找,而你的数据中不存在名为True的列,因此报错。

正确实现方式

根据你的需求(为原DataFrame添加Buys和Sells列,统计对应分组下的买卖数量),提供以下几种可行方案:

方案1:使用transform广播统计结果到原行

如果需要为每个包含side的分组标记该组内的Buy/Sell数量:

df["Buys"] = df.groupby(['symbol','month','counterparty','side'])['side'].transform(lambda x: (x == 'Buy').sum())
df["Sells"] = df.groupby(['symbol','month','counterparty','side'])['side'].transform(lambda x: (x == 'Sell').sum())

如果需要统计每个(symbol, month, counterparty)分组下的总Buy/Sell数量(忽略当前行的side):

df["Buys"] = df.groupby(['symbol','month','counterparty'])['side'].transform(lambda x: (x == 'Buy').sum())
df["Sells"] = df.groupby(['symbol','month','counterparty'])['side'].transform(lambda x: (x == 'Sell').sum())

方案2:用crosstab生成统计结果再合并

# 生成分组买卖计数表
counts = pd.crosstab([df['symbol'], df['month'], df['counterparty']], df['side']).reset_index()
# 合并回原DataFrame
df = df.merge(counts, on=['symbol','month','counterparty'], how='left')
# 重命名列匹配需求
df.rename(columns={'Buy':'Buys', 'Sell':'Sells'}, inplace=True)

方案3:通过groupby.apply自定义统计逻辑

def count_trades(group):
    group['Buys'] = (group['side'] == 'Buy').sum()
    group['Sells'] = (group['side'] == 'Sell').sum()
    return group

df = df.groupby(['symbol','month','counterparty']).apply(count_trades)

内容的提问来源于stack exchange,提问作者Ilan Katz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 02:30:59