[英]Data processing python for DL (AE): read multiple .txt files with coordinates, to array or dataframe,
我有多個不同長度的.txt 文件:
X,Y
145.33334350585938,596.6666870117188
147.3572998046875,591.2614135742188
149.28125,586.875
151.3013153076172,581.3974609375
X,Y
146.55398559570312,609.2018432617188
146.55398559570312,607.8530883789062
146.55398559570312,605.5582275390625
146.55398559570312,603.2935180664062
147.29171752929688,601.7035522460938
148.74122619628906,600.2540283203125
150.29244995117188,598.7027587890625
我必須以某種方式加載它們以進行一些預處理,比如將它們全部變成相同的形狀,將它們標准化以將它們用作基於自動編碼器的異常檢測模型的輸入。
這就是我到目前為止所擁有的。 但我相信有更好的方法。
import pandas as pd
import numpy as np
import os
df = pd.DataFrame(columns=range(500)) # 500 is more than the largest file's rows
for filename in os.listdir(path):
with open(path + filename) as f:
df_temp = pd.read_csv(f, sep=',', usecols=['X', "Y"])
df_temp['right'] = list(zip(df_temp['X'], df_temp['Y']))
s = df_temp['right'].to_frame().T
df = pd.concat([df, s] )
df.dropna(axis=1, how='all', inplace=True)
df.fillna(0, inplace=True)
我還直接嘗試了 numpy 數組:
for filename in os.listdir(path):
with open(path + filename) as f:
a = np.loadtxt(f, skiprows=1,usecols=(2,3), delimiter=',' )
c = np.concatenate((c, a))
那會給我所需的數組,但所有矩陣的長度都不同。 但是如何使它們都具有相同的形狀呢?
這是輸出數組的樣子。
array(
[[145.33334350585938,596.6666870117188],
[147.3572998046875,591.2614135742188]
[149.28125,586.875]
[151.3013153076172,581.3974609375],
[0,0],
[0,0],
[0,0]],
[[146.55398559570312,609.2018432617188],
[146.55398559570312,607.8530883789062],
[146.55398559570312,605.5582275390625],
[146.55398559570312,603.2935180664062],
[147.29171752929688,601.7035522460938],
[148.74122619628906,600.2540283203125],
[150.29244995117188,598.7027587890625]])
我會很高興有任何改進的跡象。
IIUC 嘗試使用列表理解來使用 glob 遍歷文件
import pandas as pd
import glob
# glob will just be the file path - e.g., 'some/file/path/*.txt'
# *.txt will return all text files in the folder
df = pd.DataFrame([list(pd.read_csv(file).itertuples(index=False, name=None))
for file in glob.glob('*.txt')])
您可以使用np.pad()
擴展每個數據數組以匹配您擁有的最大數組。
我也會盡量避免猜測你最大的數據框有多大,而只是從數據中計算出來。
例子:
dataframes = []
path = 'test219/*.txt'
for filename in sorted(glob.glob(path)):
dataframes.append(pd.read_csv(filename))
max_rows = max(df.shape[0] for df in dataframes)
max_cols = max(df.shape[1] for df in dataframes)
padded_data = []
for df in dataframes:
row_pad, col_pad = max_rows - df.shape[0], max_cols - df.shape[1]
df_padded = np.pad(df, ((0, row_pad), (0, col_pad)))
padded_data.append(df_padded)
padded_data = np.array(padded_data)
print(padded_data)
輸出:
[[[145.33334351 596.66668701]
[147.3572998 591.26141357]
[149.28125 586.875 ]
[151.30131531 581.39746094]
[ 0. 0. ]
[ 0. 0. ]
[ 0. 0. ]]
[[146.5539856 609.20184326]
[146.5539856 607.85308838]
[146.5539856 605.55822754]
[146.5539856 603.29351807]
[147.29171753 601.70355225]
[148.7412262 600.25402832]
[150.29244995 598.70275879]]]
它是如何工作的解釋:
test219
中搜索 .txt 文件。 用 Pandas 加載每一個。 (注意:這假設每個數據文件都有相同順序的 X 和 Y。)np.array()
將數組列表轉換為形狀為(2, 7, 2)
的單個 numpy 數組。 第一個索引代表文件。 第二個索引表示該文件中的行。 第三個索引代表列。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.