![](/img/trans.png)
[英]Create a Pandas dataframe from unequal length lengths by repeating one value
[英]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.