簡體   English   中英

用於 DL (AE) 的數據處理 python:讀取帶有坐標的 multiple.txt 文件,到數組或數據框,

[英]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]]]

它是如何工作的解釋:

  1. 使用 glob 模塊在目錄test219中搜索 .txt 文件。 用 Pandas 加載每一個。 (注意:這假設每個數據文件都有相同順序的 X 和 Y。)
  2. 查找每個數據幀的最大行數和最大列數。
  3. 對於每個數據幀,用零填充它的右側和底部,直到它匹配最大的一個。
  4. 現在每個數組都具有相同的形狀,可以使用np.array()將數組列表轉換為形狀為(2, 7, 2)的單個 numpy 數組。 第一個索引代表文件。 第二個索引表示該文件中的行。 第三個索引代表列。

暫無
暫無

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

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