【发布时间】:2019-10-05 07:48:58
【问题描述】:
我正在数据框中创建一个新列,该列基于整个数据框中的其他值。我找到了几种方法(如下所示),但是在处理大型数据集时它们非常慢(运行 500k 行需要 1 小时)。我希望加快这个过程的速度。
我尝试将 .apply 与 lambda 函数一起使用。我还使用 .map 获取要放入新列的列表。这两种方法都可以,但是太慢了。
values = {'ID': ['1','2','3','4','1','2','3'],
'MOD': ['X','Y','Z','X','X','Z','Y'],
'Period': ['Current','Current','Current','Current','Past','Past','Past']
}
df = DataFrame(values,columns= ['ID', 'MOD','Period'])
df['ID_MOD']=df['ID']+df['MOD']
def funct(identifier, indentifier_modification,period):
if period=="Current":
if (df.ID==identifier).sum()==1:
return "New"
elif (df.ID_MOD==indentifier_modification).sum()==1:
return "Unique"
else:
return "Repeat"
else:
return "n/a"
初始df:
ID MOD Period ID_MOD
0 1 X Current 1X
1 2 Y Current 2Y
2 3 Z Current 3Z
3 4 X Current 4X
4 1 X Past 1X
5 2 Z Past 2Z
6 3 Y Past 3Y
下面是两个太慢的方法: 1)
df['new_column']=df.apply(lambda x:funct(x['ID'],x['ID_MOD'],x['Period']), axis=1)
2)
df['new_column']=list(map(funct,df['ID'],df['ID_MOD'],df['Period']))
预期的最终df:
ID MOD Period ID_MOD new_column
0 1 X Current 1X Repeat
1 2 Y Current 2Y Unique
2 3 Z Current 3Z Unique
3 4 X Current 4X New
4 1 X Past 1X n/a
5 2 Z Past 2Z n/a
6 3 Y Past 3Y n/a
没有错误信息;运行大型数据集的代码只需约 1 小时。
【问题讨论】:
-
如果计算可以并行化也许你应该试试?