Pandas带条件分组聚合(group by)及非数值字段规则取值实现方法
Pandas按指定规则分组聚合实现方案
我们可以通过自定义聚合函数配合groupby.agg实现需求,具体代码如下:
- 预处理空值,将数据中的空字符串统一转换为Pandas空值,避免空值被计入频率统计
import pandas as pd # 原始数据 df = pd.DataFrame({'ISIN':['US02079K3059', 'US02079K3059', 'US02079K3059', 'US02079K3059', 'US02079K3059', 'US02079K3059', 'US02079K3059', 'US02079K3059', 'US00206R1023'], 'Name':['ALPHABET INC.CL.A DL-,001', 'Alphabet Inc Class A', 'ALPHABET INC CLASS A', 'ALPHABET A', 'ALPHABET INC CLASS A', 'ALPHABET A', 'Alphabet Inc. Class C', 'Alphabet Inc. Class A', 'AT&T Inc'], 'Country':['United States', 'United States', 'United States', '', 'United States', 'United States', 'United States', 'United States', 'United States'], 'Category':[ '', 'big', 'big', '', 'big', 'test', 'test', 'test', 'average'], 'Category2':['important', '', 'important', '', '', '', '', '', 'irrelevant'], 'Value':[1000, 750, 60, 50, 160, 9, 10, 10, 1]}) # 替换空字符串为Pandas空值 df = df.replace('', pd.NA)
- 自定义非数值字段的聚合函数,满足取排除空值后最高频、同频率取最先出现值的规则
def get_valid_top(s): # 过滤空值 valid_series = s.dropna() if valid_series.empty: return pd.NA # 取众数,多个众数时返回第一个出现的值 return valid_series.mode().iloc[0]
- 分组聚合,对Value字段求和,其余字段用自定义函数聚合
result = df.groupby('ISIN', as_index=False).agg( Name = ('Name', get_valid_top), Country = ('Country', get_valid_top), Category = ('Category', get_valid_top), Category2 = ('Category2', get_valid_top), Value = ('Value', 'sum') )
运行后得到的result即可匹配你期望的输出结果。
内容的提问来源于stack exchange,提问作者Economist Learning Python
相关产品推荐
相关产品推荐

