[英]fastest way to apply an async function to pandas dataframe
[英]Fastest way to apply function/dict to every element in a pandas DataFrame on selected columns
我想要:
FileNo
决定是否应用功能 样本文件:
ID FileNo Name A1 A2 A3
1 0 John a-b b-a a-a
2 0 Carol b-b a-b a-b
[...]
500 0 Steve a-a b-b a-b
501 0 Jack b-a b-a a-b
每个文件的真实尺寸:2000x15000
功能:反转字符串。
flip_over = lambda x: x[::-1]
or
my_dict = {'a-b':'b-a', 'a-a':'a-a', 'b-b':'b-b', 'b-a':'a-b'}
map(my_dict)
我目前所拥有的:
whether_to_flip = [7,15,23,36,48,85]
frames = []
base_path = "/home/user/file_"
for i in range(0, 100):
path = base_path + str(i) + ".tsv"
df = pd.read_csv(path, sep="\t", header=None)
df['FileNo'] = str(i)
if i in whether_to_flip:
for j in range(3,6):
df[j] = df[j].map(my_dict)
frames.append(df)
combined = pd.concat(frames, axis=0, ignore_index=True)
当前,这需要几个小时才能完成读取和处理,当我需要增加读取文件的数量时,达到了内存限制。
我将不胜感激,以改善此代码。 尤其是,
谢谢。
首先,我想您应该了解在读取csv上所花费的时间与反转字符串所花费的时间。
我可以看到一些可以加快程序速度的事情:
避免在列上循环
if i in whether_to_flip:
df = df.replace(my_dict)
# df = df.replace({'A1' : my_dict, 'A2' : my_dict, 'A3' : my_dict)
我认为这应该可以大大改善性能。
列表理解以避免.append
这可能会使语法更加繁琐,但效率可能会有所提高
def do_path(x):
return base_path + str(i) + ".csv"
[ pd.read_csv(do_path(i), sep="\t", header=None).assign(FileNo = str(i)) if i not in whether_to_flip
else pd.read_csv(do_path(i), sep="\t", header=None).assign(FileNo = str(i)).map(my_dict)
for i in range(0, 100)]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.