【问题标题】:NaN value same as delimiter - how do I import?NaN 值与分隔符相同 - 如何导入?
【发布时间】:2017-12-14 17:02:32
【问题描述】:

我正在尝试使用 pandas 的 read_csv 将 USDA 的 SR28 营养数据导入 python。

数据是这样描述的:

ASCII files are delimited. All fields are separated by carets (^) and text fields are
surrounded by tildes (~). A double caret (^^) or two carets and two tildes (~~) appear
when a field is null or blank.

我不知道如何处理双插入符号空值。许多行在一行中有五个或六个空白字段,导致我的行中出现“^^^^^^^^^^”。最后我的列太多了,把桌子扔了。

到目前为止,我已经尝试过:

data = pd.read_csv('.../NUT_DATA.txt', sep="^", na_values=["~~","^^"], header=None)
print(data[0:3])

从中我得到了不正确的列突破。我对正则表达式不够熟悉,无法尝试从分隔符中排除双插入符号,但即便如此,我也不知道如何区分胡萝卜是双精度的一部分还是下一列的定界符。

美国农业部原始数据样本:

~01001~^~268~^2999^0^^~4~^~NC~^~~^~~^^^^^^^~~^09/2015^
~01001~^~269~^0.06^0^^~4~^~NR~^~~^~~^^^^^^^~~^11/2002^
~01001~^~291~^0.0^0^^~4~^~~^~~^~~^^^^^^^~~^^
~01001~^~301~^24^17^0.789^~1~^~A~^~~^~~^7^19^30^4^22.021^26.496^~2, 3~^11/2002^
~01001~^~303~^0.02^18^0.011^~1~^~A~^~~^~~^7^0.00^0.15^7^-0.008^0.046^~2, 3~^03/2003^
~01001~^~304~^2^18^0.047^~1~^~A~^~~^~~^7^1^2^4^1.586^1.863^~2, 3~^03/2003^
~01001~^~305~^24^17^0.463^~1~^~A~^~~^~~^7^19^27^7^22.488^24.653^~2, 3~^03/2003^

【问题讨论】:

    标签: python csv pandas import format


    【解决方案1】:

    使用quotechar='~'

    pd.read_csv('.../NUT_DATA.txt', sep='^', quotechar='~', header=None)
    
         0    1        2   3      4   5    6   7   8    9     10     11   12      13      14    15       16  17
    0  1001  268  2999.00   0    NaN   4   NC NaN NaN  NaN   NaN    NaN  NaN     NaN     NaN   NaN  09/2015 NaN
    1  1001  269     0.06   0    NaN   4   NR NaN NaN  NaN   NaN    NaN  NaN     NaN     NaN   NaN  11/2002 NaN
    2  1001  291     0.00   0    NaN   4  NaN NaN NaN  NaN   NaN    NaN  NaN     NaN     NaN   NaN      NaN NaN
    3  1001  301    24.00  17  0.789   1    A NaN NaN  7.0  19.0  30.00  4.0  22.021  26.496  2, 3  11/2002 NaN
    4  1001  303     0.02  18  0.011   1    A NaN NaN  7.0   0.0   0.15  7.0  -0.008   0.046  2, 3  03/2003 NaN
    5  1001  304     2.00  18  0.047   1    A NaN NaN  7.0   1.0   2.00  4.0   1.586   1.863  2, 3  03/2003 NaN
    6  1001  305    24.00  17  0.463   1    A NaN NaN  7.0  19.0  27.00  7.0  22.488  24.653  2, 3  03/2003 NaN
    

    fillna 如果你愿意的话

    pd.read_csv('.../NUT_DATA.txt', sep='^', quotechar='~', header=None).fillna('')
    
         0    1        2   3      4   5   6  7  8  9   10    11 12      13      14    15       16 17
    0  1001  268  2999.00   0          4  NC                                              09/2015   
    1  1001  269     0.06   0          4  NR                                              11/2002   
    2  1001  291     0.00   0          4                                                            
    3  1001  301    24.00  17  0.789   1   A        7  19    30  4  22.021  26.496  2, 3  11/2002   
    4  1001  303     0.02  18  0.011   1   A        7   0  0.15  7  -0.008   0.046  2, 3  03/2003   
    5  1001  304     2.00  18  0.047   1   A        7   1     2  4   1.586   1.863  2, 3  03/2003   
    6  1001  305    24.00  17  0.463   1   A        7  19    27  7  22.488  24.653  2, 3  03/2003   
    

    【讨论】:

    • 如果你不介意我问... quotechar 的目的是什么?
    • 啊!我不需要指定 na_values,因为 '~~' 相当于典型 csv 中的 ',,'。在我的脑海中,我看到','的等价物是'~~~~' 出于某种原因。并且 quotechar 让 read_csv 知道波浪号标记字符串。我想。
    • @cᴏʟᴅsᴘᴇᴇᴅ quotechar 指定文本应包含的字符。
    猜你喜欢
    • 2020-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-31
    • 2023-03-21
    相关资源
    最近更新 更多