簡體   English   中英

熊貓read_csv,最后一列包含逗號

[英]pandas read_csv with final column containing commas

因此,我的書中有一個csv數據集格式正確,我正在嘗試獲取pandas包以正確加載它。 標頭由5個列名組成,但最后一列由包含未轉義逗號的JSON對象組成。 例如

A,B,C,D,E
1,2,3,4,{K1:V1,K2:V2}

我正在通過簡單的training = pd.read_csv('data/training.dat')加載數據

但是,pandas顯然將其他逗號誤解為新的未標記的列,並且出現了這樣的錯誤:

CParserError: Error tokenizing data. C error: Expected 75 fields in line 3, saw 84

我正在嘗試瀏覽文檔,但顯然失敗了,有人知道如何正確配置pd.read_csv命令以正確解析它嗎?

我猜是替代方案,因為我可以將腳本的鍵組合為列,從而平整化JSON對象。

如果您可行的是將{替換為"{ ,並將}替換為}" ,則可以通過以下方式正確讀取: pd.read_csv('data/training.dat',quotechar='"',skipinitialspace=True)

編輯:

或尋求基於正則表達式的解決方案:

In [205]:
print pd.read_csv('a.data',sep=",(?![^{]*\})", header=None)
   0  1  2  3              4
0  A  B  C  D              E
1  1  2  3  4  {K1:V1,K2:V2}

[2 rows x 5 columns]

我認為這取決於您要使用JSON進行的操作。 如果您只是想忽略它,可能最簡單的方法是將注釋字符設置為{ (對於此以及下一個,我認為您在其他列中沒有括號)。

pd.read_csv(
    'woo.csv',
    comment='{' 
)

可以使用帶有read_csv的自定義分隔符從JSON中提取元素,盡管我一點也不相信這是一種明智的方法。 如果熊貓是一個捕獲組(它將re.split內部使用re.split ),則它將把分隔符變成一列,因此我可以獲得包含JSON的列。 不幸的是,由於這個原因,我也得到了很多空列。 因此, dropna

我通過loadsdumps發送了JSON,盡管顯然您想做更明智的事情。 :)

json_bit = lambda x: json.dumps(json.loads(x))

pd.read_csv(
    'woo.csv', 
    sep=r'(\{.*\})$|,', 
    converters={'None.3': json_bit}
).dropna(axis=1)

CSV樣本

A,B,C,D,E
1,2,3,4,{"K1":"V1","K2":"V2"}
3,2,3,4,{"K1": "V1", "k£": {"k3": "v3"},  "K2":"V2"}

無需預處理csv文件,只需使用引擎類型python即可:

dataset = pd.read_csv('sample.csv', sep=',', engine='python')

暫無
暫無

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

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