【问题标题】:Pandas - How to parallelize for loop execution on sub-sets of dataPandas - 如何在数据子集上并行化循环执行
【发布时间】:2021-02-22 10:21:31
【问题描述】:

我有大约 5000 万行数据和 400 万个唯一 ID。对于这些 ID 中的每一个,我想计算支付的净金额(而不是累积的,由“支付”表示)。 原始数据框如下所示: Original dataframe

这是我想要的结果: Resultant dataframe

通过通常的 for 循环方法执行此操作非常慢,我希望加快此过程,但主要问题是需要一次为每个唯一 ID 执行此操作(以免产生差异)。因此,我不能为此使用.apply()

这是我现在的代码:

df_super = pd.DataFrame()
for idx, df_sub in df.groupby("ID"):
    df_sub.loc[:,'net_paid_amount'] = df_sub['paid'] - df_sub['paid'].shift(1) # Getting difference b/w last amount and current amount
    df_sub['net_paid_amount'].fillna(df_sub['paid'].iloc[0], inplace=True) # Filling first value which appears as "NaN"
    df_super = df_super.append(df_sub)

有没有什么方法可以代替 for 循环来做到这一点?

【问题讨论】:

  • 嗨,如果您不需要 for 循环,您可以简单地使用 df['net_paid_amount'] = df.groupby("ID")['paid'].diff().fillna(df['paid']) 并且如果您不想在 df 中添加列,但在df_super,然后先创建一个副本,然后对 df_super 执行相同操作。请注意,两种方法的结果顺序不同
  • 这正是我想要的。非常感谢 Ben.T !!

标签: python pandas dataframe parallel-processing


【解决方案1】:

正如 Ben.T 在 cmets 中正确指出的那样,解决方案是:

df['net_paid_amount'] = df.groupby("ID")['paid'].diff().fillna(df['paid'])

.diff() 用于获取 b/w 连续行的差异,.groupby("ID") 确保它仅在每个唯一 ID 上执行,.fillna(df['paid']) 负责此操作后创建的“NaN”值。

【讨论】:

  • 还有更多解释,您的代码中超级慢的是在每个循环的数据帧上使用append。在列表中append 或在循环中在字典中添加条目会更有效,然后concat 在外面,请参阅this
  • 好的,我不知道附加到 DataFrame 是一个超级慢的过程,谢谢!我正在尝试接受我的回答,但网站说我只能在 24 小时后这样做,所以我会在时间结束后立即这样做。
猜你喜欢
  • 2022-01-01
  • 1970-01-01
  • 2017-08-23
  • 1970-01-01
  • 1970-01-01
  • 2014-02-20
  • 1970-01-01
  • 2018-04-11
  • 1970-01-01
相关资源
最近更新 更多