我有一些財務資料存盤在 csv 中。當加載存盤在 csv 中的串列串列時,問題就出現了。我現在的目標是將 csv 加載到普通串列中,我可以壓縮并映射到我需要的任何內容。目前已經找到了一種使用 .to_string() 來創建我的串列串列的字串表示形式,然后將 ast.literal_eval 轉換為實際串列的方法。
原始 csv 檔案資料(只是 'Bids' 列,不想把我的帖子塞滿整個檔案):
[['1548.36000000', '36.94670000'], ['1548.35000000', '2.75850000'], ['1548.32000000', '4.56580000'], ['1548.31000000', '7.59050000'], ['1548.30000000', '18.99930000'], ['1548.26000000', '3.60850000'], ['1548.25000000', '4.30280000'], ['1548.17000000', '0.02000000'], ['1548.12000000', '29.70940000'], ['1548.03000000', '0.20000000']]
我想做的事:
df = pandas.read_csv('C:/Users/Ethan/Desktop/csv/test.csv', names=['E','ID','Bids','Asks'])
df = (df['Bids']).to_string(index=False)
bids = ast.literal_eval(df)
這會產生一個錯誤:
[['1548.36000000', '36.94670000'], ['1548.35000...
^SyntaxError: unterminated string literal (detected at line 1)
在沒有 ast.literal_eval() 的情況下簡單地運行 len(df) 會產生一個 50 的字串長度,這顯然是幾百個短
df = pandas.read_csv('C:/Users/Ethan/Desktop/csv/test.csv', names=['E','ID','Bids','Asks'])
df = (df['Bids']).to_string(index=False)
print(len(df))
>50
因此,python 似乎無法 literal_eval 我的字串,因為它根本沒有加載整個內容。那么為什么字串文字未終止是有道理的。有沒有人遇到過這個?另一種從單個 csv 列加載串列串列的方法也將受到贊賞,但很高興知道為什么這不起作用。
uj5u.com熱心網友回復:
感謝大家!在您的幫助下,我的解決方案變得更簡單,使用 .at[] .at[] 回傳一個字串,而不是我可以使用 literal_eval 將其轉換為串列的任何型別的物件!
df = pandas.read_csv('C:/Users/Ethan/Desktop/csv/test.csv', names=['E','ID','Bids','Asks'])
df2 = df.at[0,'Bids']
dflist = ast.literal_eval(df2)
print(type(dflist))
print(dflist)
print(dflist[0])
結果:
<class 'list'>
[['1548.36000000', '36.94670000'], ['1548.35000000', '2.75850000'], ['1548.32000000', '4.56580000'], ['1548.31000000', '7.59050000'], ['1548.30000000', '18.99930000'], ['1548.26000000', '3.60850000'], ['1548.25000000', '4.30280000'], ['1548.17000000', '0.02000000'], ['1548.12000000', '29.70940000'], ['1548.03000000', '0.20000000']]
['1548.36000000', '36.94670000']
uj5u.com熱心網友回復:
如果它太長,pandas DataFrameto_string
方法不會回傳完整的字串表示。
例如
df = pd.DataFrame({1:[[1, [2]]*1000]})
df
1
0 [1, [2], 1, [2], 1, [2], 1, [2], 1, [2], 1, [2...
df[1].to_string(index=False)
'[1, [2], 1, [2], 1, [2], 1, [2], 1, [2], 1, [2]...'
嘗試類似:
[ast.literal_eval(row) for row in df["bids"].astype("string").to_list()]
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/504391.html