【问题标题】:python, pandas, work through bad datapython,pandas,处理不良数据
【发布时间】:2016-10-20 13:58:43
【问题描述】:

所以我有一个非常大的数据框,其中大部分是浮点数(从 csv 读取),但时不时地,我得到一个字符串或 nan

                         date load
0  2016-07-12 19:04:31.604999    0
...
10 2016-07-12 19:04:31.634999    nan
...
50 2016-07-12 19:04:31.664999    ".942.197"
...

我可以处理 nans(插值),但不知道如何使用 replace 来捕获字符串,而不是数字

df.replace(to_replace='^[a-zA-Z0-9_.-]*$',regex=True,value = float('nan'))

返回所有的nan。只有当它实际上是一个字符串时,我才想要 nans

【问题讨论】:

  • 你能发一个“奇怪的东西”的例子吗
  • 字符串是我遇到的唯一问题,从我的问题中删除了“奇怪的东西”。

标签: python pandas data-cleaning


【解决方案1】:

我想你想要pandas.to_numeric。它适用于类似系列的数据。

In [1]: import pandas as pd

In [2]: df = pd.DataFrame([0, float('nan'), '.942.197'], columns=['load'])

In [3]: df
Out[3]: 
       load
0         0
1       NaN
2  .942.197

In [4]: pd.to_numeric(df['load'], errors='coerce')
Out[4]: 
0    0.0
1    NaN
2    NaN
Name: load, dtype: float64

实际上to_numeric 会尝试将每个项目转换为数字,因此如果您有一个看起来像数字的字符串,它将被转换:

In [5]: df = pd.DataFrame([0, float('nan'), '123.456'], columns=['load'])

In [6]: df
Out[6]: 
      load
0        0
1      NaN
2  123.456

In [7]: pd.to_numeric(df['load'], errors='coerce')
Out[7]: 
0      0.000
1        NaN
2    123.456
Name: load, dtype: float64

除了迭代(或者可能使用applymap)并检查isinstance之外,我不知道有任何方法可以将每个非数字类型转换为nan

【讨论】:

  • 这导致了 992344 的值(当我知道我的数据只在零和一之间时,这只是一个巨大的数字),所以我不得不跟进 df = df[df
  • @user2539738 是的,我跳过了那部分,因为您的示例没有任何数字字符串。见编辑。我不知道如何以一种优雅而有效的方式将每个字符串转换为nan,如果这是你想要的。
【解决方案2】:

据我了解,.replace() 仅适用于 string 数据类型。如果将其应用于非字符串数据类型(例如您的数字类型),它将返回 nan。在使用替换之前将整个帧/系列转换为字符串可以解决这个问题,但可能不是这样做的“最佳”方式(例如,请参阅@Goyo 的答案)!

请参阅this 页面上的注释。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-17
    • 1970-01-01
    • 2017-03-16
    • 2013-08-28
    • 1970-01-01
    • 2010-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多