【问题标题】:Handling multiple for loops in python pandas在 python pandas 中处理多个 for 循环
【发布时间】:2020-09-25 09:46:53
【问题描述】:

我正在处理一个包含 5 列数据的 pandas 数据框。我需要在每列上添加过滤器以执行某些计算。

for mfilter in raw_df['Column1'].unique():

        m_filter=raw_df[raw_df['Column1']==mfilter]
        for rfilter in m_filter['Column2'].unique():

            r_filter=m_filter[m_filter['Column2']==rfilter]
            for cfilter in r_filter['Column3'].unique():

                c_filter=r_filter[r_filter['Column3']==cfilter]
                for cafilter in c_filter['Column4'].unique():

                    ca_filter=c_filter[c_filter['Column4']==ca_filter]

                    for part in ca_filter['part_no'].unique():


                        part_df=ca_filter[(category_filter['part_no']==part)]

我还有另一列“值”,在输入“部分”for 循环后,我将在该列上执行一些计算。

由于数据量很大,完成执行需要大约 7-8 小时(每个部分大约 1 秒)的时间。有没有更好的方法可以减少花费的时间,提高时间效率?

以下是一些示例数据:

Column1 Column2 Column3 part_no Values
A   J   X   1   1
A   K   Y   2   2
B   K   X   3   3
C   L   Y   4   4
C   L   X   5   5
D   J   X   6   6
D   J   X   6   7
D   J   X   6   8
C   L   Y   4   9
C   L   Y   4   10
C   L   Y   4   11

如果我们观察,在数据集中,Values 列对于每个部分(在每个类别中)都有一定的值。在获取每个零件数据时,我必须借助该零件数据的值执行某些计算。我将把这个 part_df 推送到另一个函数,剩下的任务在这个函数中进行。

【问题讨论】:

  • 您能否提供少量示例数据(例如 CSV 或构建示例 DataFrame 的实际 Pandas 代码),用英语描述您想要完成的最终目标,并展示样本数据的最终结果?
  • 看起来像groupby(['Column1','Column2','Column3', 'Column4', 'part_no'])
  • 两个注意事项:(1) 变量名为 mfilterm_filter 意味着不同的事物绝对是一场噩梦,并且 (2) 你似乎在每次迭代中都覆盖了 part_df,所以为什么不只是跳到最后一次迭代并立即生成最终的 part_df 吗?我确定这不是您想要的,但这就是您发布的代码似乎要做的。
  • @JohnZwinck 我更新了帖子,提供了更多见解。请看一下。

标签: python pandas performance for-loop time


【解决方案1】:

你可以使用这样的东西(我没有使用Column4,因为你的示例数据中不存在):

df.groupby(['Column1', 'Column2', 'Column3', 'part_no']).apply(print)

它在每个组上调用指定的函数(在这种情况下为print),对于指定的列具有相同的值。输出是:

  Column1 Column2 Column3  part_no  Values
0       A       J       X        1       1
  Column1 Column2 Column3  part_no  Values
1       A       K       Y        2       2
  Column1 Column2 Column3  part_no  Values
2       B       K       X        3       3
  Column1 Column2 Column3  part_no  Values
4       C       L       X        5       5
   Column1 Column2 Column3  part_no  Values
3        C       L       Y        4       4
8        C       L       Y        4       9
9        C       L       Y        4      10
10       C       L       Y        4      11
  Column1 Column2 Column3  part_no  Values
5       D       J       X        6       6
6       D       J       X        6       7
7       D       J       X        6       8

现在您需要做的就是定义一个函数,其中包含您在内循环中的所有内容,例如:

def Pothuri(part_df):
    # whatever other code you didn't show us, using part_df['Values'] etc.

然后:

df.groupby(['Column1', 'Column2', 'Column3', 'part_no']).apply(Pothuri)

【讨论】:

  • 不客气。如果您不介意,当您弄清楚现在运行需要多少时间时,我将不胜感激。这在很大程度上取决于数据以及您的函数实际运行需要多长时间。
  • 是的,是否可以将我拥有的另一个数据帧与 grouped_data 一起传递到相同的函数中?
  • 是的,您可以使用.apply(Pothuri, arg1, arg2),它每次都会将 arg1 和 arg2 作为附加参数传递给您的函数。此处的文档:pandas.pydata.org/pandas-docs/stable/reference/api/…
  • 最初代码运行需要 15 小时,采用这种方法节省了 4 小时(目前是 11 小时)
猜你喜欢
  • 2016-03-31
  • 2013-12-10
  • 2022-12-04
  • 2018-06-15
  • 2013-06-11
  • 1970-01-01
  • 2021-09-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多