【问题标题】:Alternative to nested for-loop替代嵌套 for 循环
【发布时间】:2020-12-22 10:00:06
【问题描述】:

我有一个 pandas df,其中一些列包含空白值。我有一个嵌套的 for 循环,通过从列表中提取这些值来填充这些列。给定列的所有行都获得相同的值,这是正确的。这里的顺序很重要,因为 col1 需要值 val1

import pandas as pd

df = pd.DataFrame({"col1": ["", "", ""],
                     "col2": ["", "", ""],
                     "col3": ["Facebook, Instagram", "Facebook, Facebook", "Twitter"]})

Columns = ['col1', 'col2'] #list of column names that the code should iterate over
Values = ['val1', 'val2'] #list of values to be inserted in the given columns

for n in Columns:
    for i in df:
        df[Columns] = Values

输出:

    col1    col2    col3
0   val1    val2    Facebook, Instagram
1   val1    val2    Facebook, Facebook
2   val1    val2    Twitter

我当前的代码可以工作,但处理大量数据时速度很慢。我可以做些什么来改进它?

【问题讨论】:

  • 你能发布预期的输出吗
  • 我发布了输出
  • for col, val in zip(Columns, Values): df[col] = val

标签: python pandas performance for-loop optimization


【解决方案1】:

我认为最简单的方法是传递变量,例如:

df[Columns] = Values
print (df)
   col1  col2                 col3
0  val1  val2  Facebook, Instagram
1  val1  val2   Facebook, Facebook
2  val1  val2              Twitter
100k 行的

性能

df = pd.DataFrame({"col1": ["", "", ""],
                     "col2": ["", "", ""],
                     "col3": ["Facebook, Instagram", "Facebook, Facebook", "Twitter"]})

Columns = ['col1', 'col2'] #list of column names that the code should iterate over
Values = ['val1', 'val2'] #list of values to be inserted in the given columns

df = pd.concat([df] * 100000, ignore_index=True)


%timeit df[Columns] = Values
7.53 ms ± 40.9 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

【讨论】:

  • @Johnny - 我今天更新到 pandas 1.1.1 和 python 3.8,所以性能应该更好
  • 4.01 ms ± 39.1 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)...可能是内存频率差距。@jezrael
  • @Johnny - 也取决于 PC,操作系统...我使用 print (pd.show_versions()) commit : f2ca0a2665b2d169c97de87b8e778dbed86aea07 python : 3.8.5.final.0 python-bits : 64 OS : Windows OS-release : 7 Version : 6.1.7601 machine : AMD64 processor : Intel64 Family 6 Model 60 Stepping 3, GenuineIntel byteorder : little LC_ALL : None LANG : en LOCALE : Slovak_Slovakia.1250
  • commit : f2ca0a2665b2d169c97de87b8e778dbed86aea07 python : 3.8.5.final.0 python-bits : 64 OS : Windows OS-release : 10 Version : 10.0.18362 machine : AMD64 processor : Intel64 Family 6 Model 158 Stepping 13, GenuineIntel byteorder : little LC_ALL : None LANG : None LOCALE : Chinese (Simplified)_China.936 或许你应该试试Win10
  • @Johnny - PC 好像很相似
【解决方案2】:

两个循环(外部和内部)都是不必要的:ni 从未使用过,并且您正在执行相同的操作 n*i 次,因此代码很慢。只需摆脱循环,只需使用df[Columns] = Values

【讨论】:

    猜你喜欢
    • 2012-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多