进行聚合时如何忽略数据框中的特定列
Posted
技术标签:
【中文标题】进行聚合时如何忽略数据框中的特定列【英文标题】:How to ignore specific column in dataframe when doing an aggregation 【发布时间】:2020-05-04 19:06:23 【问题描述】:有没有办法在数据框上进行 pandas groupby 聚合并从列中返回某个字符串? 我有一个像这样的数据框:
lst = [[ 100, 'buicks', .001, np.nan, np.nan], [101, 'chevy', .002, np.nan, np.nan],
[102, 'olds', .003, .006, np.nan], [100, 'buick', np.nan, .004, np.nan],
[103, 'nissan', np.nan, np.nan, .1], [103,'nissans', np.nan, .14, np.nan]]
df = pd.DataFrame(lst, columns=['car_id', 'name', 'aa', 'bb', 'cc'])
car_id name aa bb cc
0 100 buicks 0.001 NaN NaN
1 101 chevy 0.002 NaN NaN
2 102 olds 0.003 0.006 NaN
3 100 buick NaN 0.004 NaN
4 103 nissan NaN NaN 0.1
5 103 nissans NaN 0.140 NaN
需要这个:
0 100 buicks 0.001 0.004 NaN
1 101 chevy 0.002 NaN NaN
2 102 olds 0.003 0.006 NaN
4 103 nissans NaN 0.140 0.1
我要做的是按 car_id 列分组,然后对 aa、bb、cc 列求和。但是,名称列值可能不一样,但我需要保留其中一个。我不在乎哪一个。 我在看:Pandas sum by groupby, but exclude certain columns 结果是这样的:
df.groupby('car_id').agg('aa': np.sum, 'bb': np.sum, 'cc':np.sum)
但这会删除名称列。我假设我可以在上面的语句中添加名称列,并且可以在其中放置一个操作来返回字符串。
谢谢
【问题讨论】:
【参考方案1】:是的,您确实可以将first
用于name
列:
df.groupby('car_id').agg('name':'first',
'aa':'sum',
'bb':'sum',
'cc':'sum')
输出:
name aa bb cc
car_id
100 buicks 0.001 0.004 0.0
101 chevy 0.002 0.000 0.0
102 olds 0.003 0.006 0.0
103 nissan 0.000 0.140 0.1
【讨论】:
【参考方案2】:这里有 lambda,以防你想要 NaN:
df.groupby('car_id').agg('name':'first', 'aa':'sum', 'bb':'sum', 'cc': lambda x: x.sum(skipna=False))
【讨论】:
【参考方案3】:满足你的输出
s=df.groupby(['car_id'])[['aa','bb','cc']].sum(min_count=1)
s['name']=df.drop_duplicates('car_id').set_index('car_id').name
s
Out[185]:
aa bb cc name
car_id
100 0.001 0.004 NaN buicks
101 0.002 NaN NaN chevy
102 0.003 0.006 NaN olds
103 NaN 0.140 0.1 nissan
【讨论】:
【参考方案4】:pd.concat([df.groupby('car_id').apply(lambda x: x.head(1))[['car_id','name']].set_index('car_id'), \
df.groupby('car_id').agg('aa': np.sum, 'bb': np.sum, 'cc':np.sum).reset_index().set_index('car_id')], axis = 1).reset_index()
car_id name aa bb cc
0 100 buicks 0.001 0.004 0.0
1 101 chevy 0.002 0.000 0.0
2 102 olds 0.003 0.006 0.0
3 103 nissan 0.000 0.140 0.1
【讨论】:
以上是关于进行聚合时如何忽略数据框中的特定列的主要内容,如果未能解决你的问题,请参考以下文章