![](/img/trans.png)
[英]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.