我有一個 .txt 檔案,其中包含諸如“G1 X174.774 Y46.362 E1.48236”、“M73 Q1 S245”之類的行,所有行都是一個字母,然后是一個數字,然后是一個空格。我正在嘗試創建一個資料框,使每一行都是我檔案中的一行,每一列都是一個字母。如果我的檔案只是上面的兩行,我得到的資料框將是
G X Y E M Q S
1 174.774 46.362 1.48236 0 0 0
0 0 0 0 73 1 245
到目前為止,我有一個包含 .txt 檔案中所有可能字母列的資料框,并且 .txt 檔案現在表示為表示檔案每一行的字串串列。截至目前,我只能弄清楚如何使用以下 for 回圈將每一行單獨添加到 df:
for j in tqdm(range(len(lines))):
line = lines[j]
points = line.split()
k = [x[0] for x in points]
v = [x[1:] for x in points]
line_dict = dict(zip(k, v))
df.loc[j] = pd.Series(line_dict)
這給了我想要的結果(未指定的值為 NaN,但我可以稍后將它們更改為零),但由于我的檔案有 200k 行,每個檔案大約需要一個小時。有沒有更快的方法可以做到這一點?我一直在嘗試想出一種使用串列理解的方法,但是使用字典讓我有點困惑,而且我不確定無論如何這會使事情變得多快。我在 stackoverflow 上找不到太多關于這個主題的資訊,但如果我遺漏了什么,請隨時與我分享鏈接!謝謝!
uj5u.com熱心網友回復:
是的,我懷疑有。不要在回圈中遞增地增加資料框中的行數:
df.loc[j] = pd.Series(line_dict)
這將導致二次時間復雜度。
相反,將這些字典累積到一個串列中,然后在最后從該串列創建一個 pandas 資料框。所以:
data = []
for line in tqdm(range(lines)):
points = line.split()
k = [x[0] for x in points]
v = [x[1:] for x in points]
line_dict = dict(zip(k, v))
data.append(line_dict)
df = pd.DataFrame(data)
以上應該是線性時間。
uj5u.com熱心網友回復:
在中指定sep引數pandas.read_csv可能是個好主意。如果分隔符是空格,則資料框構造可以按如下方式實作:
import pandas as pd
df = pd.read_csv('file.txt', sep=' ')
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/537559.html
上一篇:回圈洗掉所選資料框列標題中的字串
