【问题标题】:Adding a pandas column without creating a list添加熊猫列而不创建列表
【发布时间】:2016-01-13 20:16:44
【问题描述】:

我有 2 个超过 100 万行的数据集,我正在使用 pandas 对其进行分析(因此它们都是 pd.Dataframe 并注明 df1df2)。我需要根据 df2 的值向 df1 添加一列。我使用了 python 列表,但速度非常慢。有什么更快的建议吗?

import pandas as pd, numpy as np

numObs = []
for line in np.array(df1):
    numObs.append([num for i,num,exp in df2 if i==line[0]][0])
df1['NumObs'] = pd.Series(np.array(numObs),index = df1.index)

【问题讨论】:

  • 你应该解释你的数据集是什么样的,以及你是如何添加这个 numobs(条件等)的。而不仅仅是代码。
  • 看起来你所做的只是将df2 的第一列与df1 的第一列进行比较,这是正确的吗?

标签: python list numpy pandas


【解决方案1】:

与其说是创建一个列表,不如说是你有一个嵌套循环,它将带你遍历df1df2 的所有组合。大概

for line in np.array(df1):
    numObs.append([num for i,num,exp in df2 if i==line[0]][0])

扩展到

for line in np.array(df1):
    for i, num, exp in df2:
         finds = []
         if i==line[0]:
            finds.append(num)
         numObs.append(finds[0])

通常,列表推导比显式循环更快,但在这里您将丢弃大部分内部循环找到的内容。找到匹配项时简单地从内部循环中中断,可以节省大量时间(取决于它必须在 df2 中迭代多远才能找到匹配项。

for line in np.array(df1):
    for i, num, exp in df2:
         finds = []
         if i==line[0]:
            numObs.append(num)
            break

我对 Pandas 不是很熟悉。 'i' 是行数,'num' 是值吗?所以如果line[0] 是10,你想要df2[10](或一些这样的表达式)?您正在以一种或其他方式根据df1 的第一个“列”在df2 中查找值,对吧?

【讨论】:

    猜你喜欢
    • 2015-09-20
    • 1970-01-01
    • 2020-12-27
    • 1970-01-01
    • 2018-10-03
    • 1970-01-01
    • 2023-01-14
    • 2023-02-26
    • 2022-01-26
    相关资源
    最近更新 更多