python - 更新 Pandas 数据帧子集的子集的值对于大型数据集来说太慢了

标签 python pandas performance bigdata dask

问题陈述:我正在处理医院所有就诊的交易数据,我需要在每个患者的第一笔坏账交易之后删除每笔坏账交易。

我遇到的问题:我的代码适用于小型数据集,但实际数据集约为 5GB 和 1300 万行。该代码已经运行了好几天了,但仍未完成。作为背景,我的代码位于标准工作 PC 上运行的 Jupyter 笔记本中。

示例数据

import pandas as pd

    df = pd.DataFrame({"PatientAccountNumber":[113,113,113,113,225,225,225,225,225,225,225], 
                       "TransactionCode":['50','50','77','60','22','77','25','77','25','77','77'],
                       "Bucket":['Charity','Charity','Bad Debt','3rd Party','Self Pay','Bad Debt',
                                 'Charity','Bad Debt','Charity','Bad Debt','Bad Debt']})
    
    
    print(df)

示例数据框

    PatientAccountNumber TransactionCode     Bucket
0                    113              50    Charity
1                    113              50    Charity
2                    113              77   Bad Debt
3                    113              60  3rd Party
4                    225              22   Self Pay
5                    225              77   Bad Debt
6                    225              25    Charity
7                    225              77   Bad Debt
8                    225              25    Charity
9                    225              77   Bad Debt
10                   225              77   Bad Debt

解决方案

for account in df['PatientAccountNumber'].unique():
    mask = (df['PatientAccountNumber'] == account) & (df['Bucket'] == 'Bad Debt')
    df.drop(df[mask].index[1:],inplace=True)

print(df)

期望的结果(每位患者最多应有一笔坏账交易)

   PatientAccountNumber TransactionCode     Bucket
0                   113              50    Charity
1                   113              50    Charity
2                   113              77   Bad Debt
3                   113              60  3rd Party
4                   225              22   Self Pay
5                   225              77   Bad Debt
6                   225              25    Charity
8                   225              25    Charity

替代方案

for account in df['PatientAccountNumber'].unique():
    mask = (df['PatientAccountNumber'] == account) & (df['Bucket'] == 'Bad Debt')
    mask = mask & (mask.cumsum() > 1)
    df.loc[mask, 'Bucket'] = 'DELETE'

df = df[df['Bucket'] != 'DELETE]

尝试使用 Dask

我想也许 Dask 可以帮我解决问题,但我得到了以下错误代码:

  1. 在第一个解决方案上使用 Dask - “NotImplementedError:Series getitem in only supported for other series objects with matching partition structure”
  2. 在第二种解决方案上使用 Dask - “TypeError:'_LocIndexer' 对象不支持项目分配”

最佳答案

您可以在 accountNumber 和 Bucket 上使用 df.duplicated 并检查 Bucket 是否为坏帐来解决此问题:

df[~(df.duplicated(['PatientAccountNumber','Bucket']) & df['Bucket'].eq("Bad Debt"))]

   PatientAccountNumber TransactionCode     Bucket
0                   113              50    Charity
1                   113              50    Charity
2                   113              77   Bad Debt
3                   113              60  3rd Party
4                   225              22   Self Pay
5                   225              77   Bad Debt
6                   225              25    Charity
8                   225              25    Charity

关于python - 更新 Pandas 数据帧子集的子集的值对于大型数据集来说太慢了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68808206/

相关文章:

python - 在 python 中使用 re 删除 unicode 表情符号

python - pandas loc 具有多个 or 条件

python - 分隔 Pandas 数据框中共享同一列的月份和年份

python - 我如何删除 Pandas 中的过滤器数据(数据处理)

javascript - 替代 JS/JQuery 中的许多 if/else 语句?

javascript - 'evil' 等式会减慢代码速度吗?

python - 使用 scikit learn 获取信息量最大的特征时遇到问题?

python - 如何在多维 numpy 数组的多个轴上找到最大值?

c++ - 检查客户端和服务器之间的延迟

python - 使用 np.load 进度条加载 .npy 文件