我有一個看起來像這樣的 CSV 檔案,
title 1
"x,y,z,w"
"1,2,3,4"
title 2
"a,s,d,f,g,h,j,k,l,z,x,c,v,b,n,m"
"1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7"
"1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7"
"1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7"
"1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7"
"1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7"
"1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7"
"1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7"
title 3
x,y,z,w
1,2,3,4
我正在嘗試讀取這個具有不同列結構的 CSV 檔案,我可以使用skiprows、skipfooter和quoting=csv.QUOTE_NONE. 我quoting=csv.QUOTE_NONE用來解釋具有不同列的雙引號 ( ") 行,而不是單個字串。
import csv
import pandas as pd
title_1 = 0
title_2 = 3
title_3 = 12
total = 14
title_1_df = pd.read_csv("test_csv.csv", engine='python', skiprows=title_1 1, skipfooter =(total - title_2) 1, quoting=csv.QUOTE_NONE)
title_2_df = pd.read_csv("test_csv.csv", engine='python', skiprows=title_2 1, skipfooter=(total - title_2) 1, quoting=csv.QUOTE_NONE)
title_3_df = pd.read_csv("test_csv.csv", engine='python', skiprows=title_3 1)
我能夠讀取 CSV 檔案,但雙引號也出現在 DataFrame 中。下面是輸出。
有沒有辦法在讀取 CSV 檔案時洗掉雙引號?正如您在輸出中看到的title_1_df,title_2_df雙引號出現在第一列和最后一列中,我希望輸出為title_3_df.
uj5u.com熱心網友回復:
仔細查看pd.read_csv's (many) options,我找不到在閱讀程序中洗掉這些引號的方法,并且考慮一下,我不確定是否應該有一個。
參考是針對單個值而不是行進行的。例如,它通常可能用于有意地將逗號存盤為單元格資料,而不是單元格分隔符。通過告訴 pandas 忽略引號,您也告訴它引號字符 ( ") 只是普通資料。
對于這種情況,我要么在閱讀 CSV 檔案之前去掉引號,要么在閱讀后洗掉引號。
方法一:在讀取檔案前去掉引號
兩種方式。第一種是逐行做,更直觀但效率較低。另一種方法是一次性完成所有操作(不太直觀但更有效):
import re
with open('test_csv.csv') as f:
text = re.sub(r'"*([\r\n]) "*|(?:^"*|"*$)', '\\1', f.read())
現在,您可以將處理后的資料寫回檔案并使用 讀取檔案pd.read_csv,也可以直接從字串中讀取 CSV。我將展示這兩種方法:
寫回檔案:
with open('test_csv.csv', 'w') as f:
f.write(text)
header_df = pd.read_csv("test_csv.csv", ...)
data_df = pd.read_csv("test_csv.csv", ...)
footer_df = pd.read_csv("test_csv.csv", ...)
直接從處理過的字串中讀取:
from io import StringIO
s = StringIO(text)
header_df = pd.read_csv(s, ...); s.seek(0)
data_df = pd.read_csv(s, ...); s.seek(0)
footer_df = pd.read_csv(s, ...); s.seek(0)
方法二、讀取檔案后去掉引號
用于df.iloc[:, [0, -1]]選擇資料框的第一列和最后一列:
def remove_quotes(df):
df.iloc[:, [0, -1]] = df.iloc[:, [0, -1]].astype(str).apply(lambda col: col.str.strip('"')).astype(int)
df.columns = df.columns.str.strip('"')
remove_quotes(header_df)
remove_quotes(data_df)
remove_quotes(footer_df)
輸出:
>>> header_df
x y z w
0 1 2 3 4
>>> data_df
a s d f g h j k l z x c v b n m
0 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7
1 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7
2 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7
3 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7
4 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7
5 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7
6 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7
>>> footer_df
x y z w
0 1 2 3 4
uj5u.com熱心網友回復:
您可以分兩遍進行,首先將它們作為一列讀入,然后通過將列的值拆分為“,”來創建一個新的 DataFrame。
import pandas as pd
df = pd.read_csv('quotes.csv')
df2 = pd.DataFrame(df[df.columns[0]].apply(lambda x: x.split(',')).to_list(), columns=df.columns[0].split(','))
print(df2)
輸出:
a s d f g h j k l z x c v b n m
0 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7
1 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7
2 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7
3 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7
4 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7
5 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7
6 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/423432.html
標籤:
