Pandas - 按函数和总和列分组以提取其他列总和为 0 的行
Posted
技术标签:
【中文标题】Pandas - 按函数和总和列分组以提取其他列总和为 0 的行【英文标题】:Pandas - group by function and sum columns to extract rows where sum of other columns is 0 【发布时间】:2022-01-24 04:33:30 【问题描述】:我有一个包含超过 300 万行的数据框。我正在尝试对 Bar_Code 列中的值进行分组,并仅提取 SOH、Cost 和 Sold_Date 中所有行的总和为零的行。
我的数据框如下:
Location Bar_Code SOH Cost Sold_Date
1 00000003589823 0 0.00 NULL
2 00000003589823 0 0.00 NULL
3 00000003589823 0 0.00 NULL
1 0000000151818 -102 0.00 NULL
2 0000000151818 0 8.00 NULL
3 0000000151818 0 0.00 2020-10-06T16:35:25.000
1 0000131604108 0 0.00 NULL
2 0000131604108 0 0.00 NULL
3 0000131604108 0 0.00 NULL
1 0000141073505 -53 3.00 2020-10-06T16:35:25.000
2 0000141073505 0 0.00 NULL
3 0000141073505 -20 20.00 2020-09-25T10:11:30.000
我试过下面的代码:
df.groupby(['Bar_Code','SOH','Cost','Sold_Date']).sum()
但我得到以下输出:
Bar_Code SOH Cost Sold_Date
0000000151818 -102.0 0.0000 2021-12-13T10:01:59.000
0.0 8.0000 2020-10-06T16:35:25.000
0000131604108 0.0 0.0000 NULL
0000141073505 -53.0 0.0000 2021-11-28T16:57:59.000
3.0000 2021-12-05T11:23:02.000
0.0 0.0000 2020-04-14T08:02:45.000
0000161604109 -8.0 4.1000 2020-09-25T10:11:30.000
00000003589823 0 0.00 NULL
我需要检查是否可以获得以下所需的输出以仅获取 SOH、Cost 和 Sold_Date 之和为 0 或 NULL 的特定行,代码忽略第一列(位置)是安全的:
Bar_Code SOH Cost Sold_Date
00000003589823 0 0.00 NULL
0000131604108 0.0 0.0000 NULL
【问题讨论】:
【参考方案1】:如果SOH
、Cost
和Sold_Date
是0
或NaN
,则过滤所有组如果首先不匹配,则获取Bar_Code
和最后一个反转掩码以过滤@ 中的所有组987654327@:
g = df.loc[df[['SOH','Cost','Sold_Date']].fillna(0).ne(0).any(axis=1), 'Bar_Code']
df1 = df[~df['Bar_Code'].isin(g)].drop_duplicates('Bar_Code').drop('Location', axis=1)
print (df1)
Bar_Code SOH Cost Sold_Date
0 00000003589823 0 0.0 NaN
6 0000131604108 0 0.0 NaN
【讨论】:
以上是关于Pandas - 按函数和总和列分组以提取其他列总和为 0 的行的主要内容,如果未能解决你的问题,请参考以下文章
pandas DataFrame中按日期(在索引中)的加权平均分组(每列不同的操作)