添加pandas列而不创建列表

时间:2015-10-15 11:31:48

标签: python list numpy pandas

我有2个超过1百万行的数据集,我正在用熊猫分析它(因此它们都是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)

1 个答案:

答案 0 :(得分:0)

您创建列表并不是很多,但是您有一个嵌套循环,将您带到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

我对熊猫并不熟悉。 'i'是行数,'num'是值吗?因此,如果line[0]为10,您需要df2[10](或某些此类表达式)?根据{{​​1}}的第一个“列”,您可以通过df2查找值的某种方式,对吧?