【问题标题】:I'am getting an memory error while iterating over pandas dataframe. How to resolve this?遍历 pandas 数据帧时出现内存错误。如何解决这个问题?
【发布时间】:2020-01-30 16:38:05
【问题描述】:

我想将每一列与不同的数字相乘并更新此数据框的值。

我写的代码是:

for j in test.columns:

    for i in r:

        for k in range(len(p)):

            test[i] = test[j].apply(lambda x:x*p[k])

            p.remove(p[k])

            break

        r.remove(i)

        break

而 p 是我想与之相乘的数字列表。

p = [74, 46, 97, 2023, 364, 1012, 8, 242, 422, 78, 55, 90, 10, 44, 1, 3, 105, 354, 4, 26, 87, 18, 889, 9, 557, 630, 214, 1765, 760, 3344, 136, 26, 56, 10, 2, 2171, 125, 446, 174, 4, 174, 2, 80, 11, 160, 17, 72]

r 是列名列表。

如何摆脱这个错误?

【问题讨论】:

  • meta.stackoverflow.com/questions/285551/… - 请不要粘贴代码图片,这样会导致无法搜索。
  • 请不要将您的代码添加为图片,而是添加为数据框,以便我们解决您的问题。看起来好像您正在使用冗余的 for 循环 + 应用,这会占用大量内存..
  • 您需要test = test * np.array(p) 吗?
  • 是的。列表中的每一列都有各自的编号,顺序相同。

标签: python pandas dataframe for-loop


【解决方案1】:

根据您最初的陈述“我想将每一列与不同的数字相乘”,我写了这个答案。 目前尚不清楚为什么在您的代码中必须多次使用 remove 以及为什么要使用如此多的 for 循环。 在我的例子中,我生成了一个 100 行和 5 列的随机数据帧,以及一个包含 5 个乘法值的数组。

import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randint(0,100,size=(100, 5)), columns=list('12345'))
p=np.random.randint(0,100,5)
for i in range(5):
    df.iloc[:,i]=df.iloc[:,i]*p[i]

【讨论】:

    【解决方案2】:

    您的堆栈跟踪指向test[i] = test[j].apply(lambda x:x*p[k])

    请注意,j(至少在您的代码示例中)尚未设置。

    也许你应该改用i

    另一种解决方案

    如果你想乘:

    • 测试中的每一列,
    • 就地,
    • 通过来自 p 的连续数字(甚至可能是一个普通的 Python 列表),
    • 但只有与 p 一样多的初始元素,
    • 假设p不长于test中的行数,

    您可以使用以下单线:

    test.iloc[:len(p)] = test.iloc[:len(p)].apply(lambda col: col * p)
    

    为了测试这个解决方案,我创建了 test 包含前 10 行的 DataFrame 来自您的样本。

    然后我将 p 定义为:p = [2, 3, 4, 5, 6, 7]

    我的代码结果是:

        0   1    2     3    4
    0   6   8    8   282   42
    1  39  24   42  1434  153
    2   4   0    8   336   48
    3  40  20   65  1085  160
    4  84  66   72  2130  366
    5  91  49  119  3283  469
    6   5   6   11   140   17
    7   4   8   12   278   51
    8   6   8   12   271   36
    9  29  25   37   741  149
    

    因此,就前 6 行而言,在每一列中:

    • 第一个元素已乘以2
    • 第二个3
    • 等等。

    也许这正是您所需要的?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-16
      • 1970-01-01
      • 2012-07-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多