簡體   English   中英

在選定列上將函數/字典應用於pandas DataFrame中每個元素的最快方法

[英]Fastest way to apply function/dict to every element in a pandas DataFrame on selected columns

我想要:

  • 將數百個制表符分隔的文件讀入pandas DataFrame中
  • 根據FileNo決定是否應用功能
  • 將功能應用於選定列上的每個元素
  • 將所有DataFrame附加並連接到一個框架中

樣本文件:

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)

當前,這需要幾個小時才能完成讀取和處理,當我需要增加讀取文件的數量時,達到了內存限制。

我將不勝感激,以改善此代碼。 尤其是,

  • 這是應用功能的最佳/最快方法嗎?
  • 這是追加和合並許多DataFrame的最佳/最快方法嗎?

謝謝。

首先,我想您應該了解在讀取csv上所花費的時間與反轉字符串所花費的時間。

我可以看到一些可以加快程序速度的事情:

避免在列上循環

您可以使用replace和my_dict :( 參考)

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM