【问题标题】:Pandas - group by function and sum columns to extract rows where sum of other columns is 0Pandas - 按函数和总和列分组以提取其他列总和为 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

【问题讨论】:

    标签: python-3.x pandas dataframe


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-15
      • 2017-03-25
      • 1970-01-01
      • 2014-03-02
      • 2020-10-04
      • 2022-07-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多