【问题标题】:Pandas read_csv(): keep 0 as 0 (not convert it to NaN)Pandas read_csv():将 0 保持为 0(不将其转换为 NaN)
【发布时间】:2013-01-21 13:21:40
【问题描述】:

我正在尝试读取一个 csv 文件,其中有一个示例:

datetime,check,lat,lon,co_alpha,atn,status,bc
2012-10-27 15:00:59,2,0,0,2.427,,,
2012-10-27 15:01:00,2,0,0,2.407,,,
2012-10-27 15:02:49,2,0,0,2.207,-17.358,0,-16162
2012-10-27 15:02:50,2,0,0,2.207,-17.354,0,8192
2012-10-27 15:02:51,1,0,0,2.207,-17.358,0,-8152
2012-10-27 15:02:52,1,0,0,2.207,-17.358,0,648
2012-10-27 15:06:03,0,51.195076,4.444407,2.349,-17.289,0,4909
2012-10-27 15:06:04,0,51.195182,4.44427,2.344,-17.289,0,587
2012-12-05 09:21:34,,,,,42.960,1,16430
2012-12-05 09:21:35,,,,,42.962,1,3597

我遇到的问题是,在只有整数的列中,0 被转换为 NaN(例如列“检查”和“状态”,这些是只有整数的列,但该列被读取为浮点数,因为有实数缺失值)。但我只想将空值转换为 NaN,而不是零。

这是我得到的:

>>> pd.read_clipboard(sep=',', parse_dates=True, index_col=0)
                     check        lat       lon  co_alpha     atn  status     bc
datetime                                                                        
2012-10-27 15:00:59      2   0.000000  0.000000     2.427     NaN     NaN    NaN
2012-10-27 15:01:00      2   0.000000  0.000000     2.407     NaN     NaN    NaN
2012-10-27 15:02:49      2   0.000000  0.000000     2.207 -17.358     NaN -16162
2012-10-27 15:02:50      2   0.000000  0.000000     2.207 -17.354     NaN   8192
2012-10-27 15:02:51      1   0.000000  0.000000     2.207 -17.358     NaN  -8152
2012-10-27 15:02:52      1   0.000000  0.000000     2.207 -17.358     NaN    648
2012-10-27 15:06:03    NaN  51.195076  4.444407     2.349 -17.289     NaN   4909
2012-10-27 15:06:04    NaN  51.195182  4.444270     2.344 -17.289     NaN    587
2012-12-05 09:21:34    NaN        NaN       NaN       NaN  42.960       1  16430
2012-12-05 09:21:35    NaN        NaN       NaN       NaN  42.962       1   3597

因此,在“检查”和“状态”列中,有很多 NaN。在 'lat' 和 'lon' 列中,0 不会转换为 NaN。

  • 使用na_values=''keep_default_na=False 没有帮助。有没有办法指定不将 int 0 转换为 NaN?还是这是一个错误?

  • 我可以使用 dtype 关键字将特定列的 dtype 指定为 int。这将 0 保持为 0,但问题是这些列还包含真正的 NaN(空值)。因此,在这种情况下,这些值也会转换为 0,因为在 int 列中您不能有 NaN。出于这个原因,我必须将所有列保留为浮点数。


编辑:升级到 pandas 0.10.1 后,即使没有指定 keep_default_nana_values,它也能按预期工作:

>>> pd.read_clipboard(sep=',', parse_dates=True, index_col=0)
                     check        lat       lon  co_alpha     atn  status     bc
datetime                                                                        
2012-10-27 15:00:59      2   0.000000  0.000000     2.427     NaN     NaN    NaN
2012-10-27 15:01:00      2   0.000000  0.000000     2.407     NaN     NaN    NaN
2012-10-27 15:02:49      2   0.000000  0.000000     2.207 -17.358       0 -16162
2012-10-27 15:02:50      2   0.000000  0.000000     2.207 -17.354       0   8192
2012-10-27 15:02:51      1   0.000000  0.000000     2.207 -17.358       0  -8152
2012-10-27 15:02:52      1   0.000000  0.000000     2.207 -17.358       0    648
2012-10-27 15:06:03      0  51.195076  4.444407     2.349 -17.289       0   4909
2012-10-27 15:06:04      0  51.195182  4.444270     2.344 -17.289       0    587
2012-12-05 09:21:34    NaN        NaN       NaN       NaN  42.960       1  16430
2012-12-05 09:21:35    NaN        NaN       NaN       NaN  42.962       1   3597

【问题讨论】:

    标签: python pandas nan


    【解决方案1】:

    您必须先将keep_default_na 设置为False

    df = pd.read_clipboard(sep=',', index_col=0, keep_default_na=False, na_values='')
    
    In [2]: df
    Out[2]: 
                         check        lat       lon  co_alpha     atn  status     bc
    datetime                                                                        
    2012-10-27 15:00:59      2   0.000000  0.000000     2.427     NaN     NaN    NaN
    2012-10-27 15:01:00      2   0.000000  0.000000     2.407     NaN     NaN    NaN
    2012-10-27 15:02:49      2   0.000000  0.000000     2.207 -17.358       0 -16162
    2012-10-27 15:02:50      2   0.000000  0.000000     2.207 -17.354       0   8192
    2012-10-27 15:02:51      1   0.000000  0.000000     2.207 -17.358       0  -8152
    2012-10-27 15:02:52      1   0.000000  0.000000     2.207 -17.358       0    648
    2012-10-27 15:06:03      0  51.195076  4.444407     2.349 -17.289       0   4909
    2012-10-27 15:06:04      0  51.195182  4.444270     2.344 -17.289       0    587
    2012-12-05 09:21:34    NaN        NaN       NaN       NaN  42.960       1  16430
    2012-12-05 09:21:35    NaN        NaN       NaN       NaN  42.962       1   3597
    

    来自read_tables的文档字符串:

    keep_default_na : bool,默认为 True
    如果指定了na_values 并且keep_default_naFalse 默认NaN
    值被覆盖,否则它们被附加到

    na_values:类列表或字典,默认None
    附加 字符串可识别为 NA/NaN。如果dict通过,具体 每列 NA 值

    【讨论】:

    • 它似乎对我没有影响(熊猫 0.10.0),我仍然得到 NaN 而不是零。
    • @joris 这很奇怪,也许升级到 0.10.1 ?
    • 我将输出添加到我的问题中。但我会用 0.10.1 试试。
    • 它在 pandas 0.10.1 中工作!感谢您的建议!但它甚至可以在不指定 keep_default_nana_values 的情况下工作。
    • @joris 我想我快疯了,我确定我测试过了!你说的很对。
    猜你喜欢
    • 2018-03-07
    • 2013-04-26
    • 2011-11-24
    • 1970-01-01
    • 1970-01-01
    • 2015-11-03
    • 2020-02-19
    • 2020-02-08
    • 1970-01-01
    相关资源
    最近更新 更多