如何在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
相关产品推荐
相关产品推荐

