【问题标题】:Can't seem to strip numbers from a string [duplicate]似乎无法从字符串中删除数字[重复]
【发布时间】:2019-11-16 07:47:19
【问题描述】:

我有一个看起来像这样的数据框。

0                                             1.144921                     
1                                             1.000000                     
2                                             1.119507                     
3                                                  inf                     
4                                             0.000000                     
5                                                  inf                     
6                                             0.000000                     
7                                             0.000000                     
8                                             1.000000                     
9                                             0.000000                     
10                                            0.000000                     
11                                            0.000000                     
12                                            1.793687                     
13                                                 inf    

我正在尝试摆脱“inf”字符串。基本上,我只想去掉所有字符串,只保留数据框中的数字。

我尝试了下面的代码。

kepler = re.sub("\D", "", kepler)
kepler = re.sub('[^0-9]','0', kepler)

当我运行这些代码行中的任何一行时,都会出现以下错误。

TypeError: expected string or bytes-like object

如果我有一个非常简单的字符串,它确实可以工作。所以,这会奏效。

s = '83jjdmi239450  19dkd'
s = re.sub("\D", "", s)

很遗憾,该代码不适用于我的数据框。有什么想法吗?谢谢。

【问题讨论】:

  • 你在这里使用熊猫吗?
  • 试试kepler = re.sub("\D", "", kepler) if type(kepler) == 'str' else kepler
  • 是的,我正在从 CSV 文件中读取数据。开普勒 = pd.read_csv(文件)
  • 你在寻找 df[df[0].apply(lambda x: type(x) != str)]

标签: python python-3.x pandas dataframe


【解决方案1】:

在示例数据帧上使用numpy.isfinite 例程:

In [176]: df
Out[176]: 
           a
0   1.000000
1   1.119507
2        inf
3   0.000000
4        inf
5   0.000000
6   0.000000
7   1.000000
8   0.000000
9   0.000000
10  0.000000
11  1.793687
12       inf

In [177]: df = df[~np.isinf(df['a'])]

In [178]: df
Out[178]: 
           a
0   1.000000
1   1.119507
3   0.000000
5   0.000000
6   0.000000
7   1.000000
8   0.000000
9   0.000000
10  0.000000
11  1.793687

【讨论】:

    【解决方案2】:

    试试

    df = pd.read_clipboard()
    df.columns = ['col1','col2']
    df
    
        col1    col2
    0   1   1.000000
    1   2   1.119507
    2   3   inf
    3   4   0.000000
    4   5   inf
    5   6   0.000000
    6   7   0.000000
    7   8   1.000000
    8   9   0.000000
    9   10  0.000000
    10  11  0.000000
    11  12  1.793687
    12  13  inf
    
    df.col2[df.col2 < np.inf]
    0     1.000000
    1     1.119507
    3     0.000000
    5     0.000000
    6     0.000000
    7     1.000000
    8     0.000000
    9     0.000000
    10    0.000000
    11    1.793687
    

    【讨论】:

      【解决方案3】:

      我正在尝试摆脱“inf”字符串。

      您将其描述为字符串,但这只是 64 位浮点数的打印表示。

      TypeError:预期的字符串或类似字节的对象

      您不能将浮点数传递给正则表达式操作,因为正则表达式需要一个字符串。

      相反,将无限量转换为NaNs,然后丢弃它们:

      rows = [dict(x=1.79),
              dict(x=math.inf)]
      df = pd.DataFrame(rows).replace([np.inf, -np.inf], np.nan)
      df = df.dropna()
      

      【讨论】:

      • 好的。得到它的工作。谢谢大家。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-08
      • 1970-01-01
      • 2020-03-30
      • 2018-02-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多