簡體   English   中英

熊貓read_csv不會將最終(未命名)列捕獲到數據框中

[英]pandas read_csv does not capture final (unnamed) column into dataframe

我正在嘗試讀取以下格式的csv文件

myHeader
myJunk
myDate
A, B, C, D
, b, c, d
dataA, dataB, dataC, dataD, EXTRA_INFO_STRING
dataA, dataB, dataC, dataD, EXTRA_INFO_STRING
dataA, dataB, dataC, dataD, EXTRA_INFO_STRING

當我使用創建數據框時

dlogframe = pd.read_csv(myPath, header=3)

我收到以下錯誤(我的數據比上面的示例復雜,但功能相同)

pandas._parser.CParserError: Error tokenizing data. C error: Expected 393 fields in line 9, saw 394

如何給EXTRA_INFO列命名,並在數據框中包含這些字符串?

[編輯]

我想出了如何跳過麻煩的行,但是現在數據沒有正確對齊

from StringIO import StringIO
s = """myHeader
myJunk
myDate
A, B, C, D
, b, c, d
dataA, dataB, dataC, dataD, EXTRA_INFO_STRING
dataA, dataB, dataC, dataD, EXTRA_INFO_STRING
dataA, dataB, dataC, dataD, EXTRA_INFO_STRING"""

df = pd.read_csv(StringIO(s), header=3, skiprows=[4])
>>print df

            A       B       C                   D
dataA   dataB   dataC   dataD   EXTRA_INFO_STRING
dataA   dataB   dataC   dataD   EXTRA_INFO_STRING
dataA   dataB   dataC   dataD   EXTRA_INFO_STRING

我想要的是:

A       B       C       D       MY_INFO
dataA   dataB   dataC   dataD   EXTRA_INFO_STRING
dataA   dataB   dataC   dataD   EXTRA_INFO_STRING
dataA   dataB   dataC   dataD   EXTRA_INFO_STRING

如果標頭后僅缺少EXTRA_INFO_STRING行,則可以分別加載列名和數據:

from StringIO import StringIO
df = pd.read_csv(StringIO(s), header=None, skiprows=5)

以下代碼(可能不是很優雅)將加載列名:

df.columns = pd.read_csv(StringIO(s), header=None, 
                       nrows=1, skiprows=3).T.append(['MY_INFO'])[0]
# 0      A       B       C       D             MY_INFO
# 0  dataA   dataB   dataC   dataD   EXTRA_INFO_STRING
# 1  dataA   dataB   dataC   dataD   EXTRA_INFO_STRING
# 2  dataA   dataB   dataC   dataD   EXTRA_INFO_STRING

測試中使用的數據:

s = """myHeader
myJunk
myDate
A, B, C, D
, b, c, d
dataA, dataB, dataC, dataD, EXTRA_INFO_STRING
dataA, dataB, dataC, dataD, EXTRA_INFO_STRING
dataA, dataB, dataC, dataD, EXTRA_INFO_STRING"""

怎么樣:

df = pd.read_csv(StringIO(s), skiprows=5, header = None, index_col = False)
df.columns = list("ABCDE")

有時,如果您對read_csv數字轉換有疑問,可以將dtype = object添加到read_csv調用中,然后稍后使用DataFrame.astype自行處理轉換。

這是我嘗試過的方法,似乎可以獲取所需格式的數據。 基本思想是“忽略所有有問題的行”(如果您知道文件結構,則有可能)。

x = pd.read_csv(StringIO.StringIO(s), names=['a', 'b', 'c', 'd', 'more_info'], header=None, skiprows=5)

這將以您想要的格式輸出。

我的經驗是使用read_csv ,人們必須嘗試幾種組合才能獲得所需的東西。

希望這可以幫助。

暫無
暫無

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

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