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】:

如果SOHCostSold_Date0NaN,则过滤所有组如果首先不匹配,则获取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 数据框进行分组

pandas DataFrame中按日期(在索引中)的加权平均分组(每列不同的操作)

Pandas 按列分组并检查多个条件以创建新的分类列

Pandas:以列表形式按列分组的每个日期的频率

将查询分组为 3 列,并在 Apex Oracle 中显示另一列的总和

pandas 在同一张表(相同的数据框)中,如何用新名称和其他行值的总和对不同的行进行分组