簡體   English   中英

使用不等長的字符串創建數據框

[英]Create a dataframe from unequal length strings

我有一個文件名及其連續路徑格式的數據框:

例如:

 files = pandas.Dataframe((   
      name            path
 0    file1.txt       \\drive\folder1\folder2\folder3\...\file1.txt   
 1    file2.pdf       \\drive\folder1\file2.pdf 
 2    file3.xls       \\drive\folder1\folder2\folder3\...\folder21\file3.xls  
 n   ...            ...))

框架的大小約為1.02E + 06條目,驅動器的深度最多為21個文件夾,但差異很大。 目標是具有以下格式的數據框:

     name           level1     level2     level3    level4  ...  level21
0    file.txt       folder1    folder2    folder3      0    ...    0      
1    file.pdf       folder1       0          0         0    ...    0   
2    file3.xls      folder1    folder2    folder3   folder4 ...  folder21
...

我分割了文件位置的字符串並創建了一個數組,如果路徑較短,則可以用零填充:

files = files.assign(plist=files['path'].iloc[:].apply(path_split))

def path_split(name):
     return np.array(os.path.normpath(name).split(os.sep)[7:])

在文件路徑中添加一個列,其中包含文件夾數量:

files = files.assign(len_plist = files.plist.iloc[:].map(len))

這里的問題是,分割路徑字符串在數據幀內創建了一個嵌套數組。 然后是一個空的Dataframe,其列數位於文件夾數量(此處為21),行數與文件數量一致(此處為1.02E + 06):

max_folder = files['len_plist'].max()  # get the maximum amount of folders    
levelcos = [ 'flevel_{}'.format(i) for i in np.arange(max_folder)]   
levels = pd.DataFrame(np.zeros((files.shape[0],max_folder)),   
                      columns =levelcos, index = files.index )

現在我用路徑數組的條目填充空白框:

levels = fill_rows(levels,files.plist.values)   

def fill_rows(df,array):
    for i,row in enumerate(array):
        df.iloc[i,:row.shape[0] - 1] = row[:-1]
    return df

這需要花費大量時間,因為路徑數組的長度變化不允許立即進行矢量化解決方案。 如果我需要循環數據幀的所有1.02E + 06行,則至少需要34小時,最多可能需要200小時。

首先,我想優化數據框的填充,第二步,我將拆分數據框,並行化操作,然后再組裝。

編輯:增加了說明,一條較短的路徑可以用零填充到最大長度。

也許我錯過了一些東西,但是為什么這對您不起作用?

expanded = files['path'].str.split(os.path.sep, expand=True).fillna(0)
expanded = expanded.rename(columns=lambda x: 'level_' + str(x))
df = pd.concat([files.name, expanded], axis=1)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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