我有2个超过1百万行的数据集,我正在用熊猫分析它(因此它们都是pd.Dataframe
并注明df1
和df2
)。我需要根据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)
答案 0 :(得分:0)
您创建列表并不是很多,但是您有一个嵌套循环,将您带到df1
和df2
的所有组合。大致
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
查找值的某种方式,对吧?