当前位置: 首页 > 知识库问答 >
问题:

在熊猫中用NaN替换空白值(空白)

周洋
2023-03-14

我想找到熊猫数据框中包含空白(任意数量)的所有值,并用NaN替换这些值。

有什么想法可以改进吗?

基本上,我想把这个转变为:

                   A    B    C
2000-01-01 -0.532681  foo    0
2000-01-02  1.490752  bar    1
2000-01-03 -1.387326  foo    2
2000-01-04  0.814772  baz     
2000-01-05 -0.222552         4
2000-01-06 -1.176781  qux     

为此:

                   A     B     C
2000-01-01 -0.532681   foo     0
2000-01-02  1.490752   bar     1
2000-01-03 -1.387326   foo     2
2000-01-04  0.814772   baz   NaN
2000-01-05 -0.222552   NaN     4
2000-01-06 -1.176781   qux   NaN

我已经设法做到了下面的代码,但人是丑陋的。这不是蟒蛇,我肯定这也不是对熊猫最有效的利用。我循环遍历每一列,并对应用一个函数生成的列掩码进行布尔替换,该函数对每个值进行正则表达式搜索,并在空格上进行匹配。

for i in df.columns:
    df[i][df[i].apply(lambda i: True if re.search('^\s*$', str(i)) else False)]=None

只需遍历可能包含空字符串的字段,即可对其进行一点优化:

if df[i].dtype == np.dtype('object')

但这算不上什么进步

最后,这段代码将目标字符串设置为无,这适用于Pandas的函数,如fillna(),但是如果我可以直接插入NaN而不是,这将是完整的。

共有3个答案

尉迟宇定
2023-03-14

怎么样:

d = d.applymap(lambda x: np.nan if isinstance(x, basestring) and x.isspace() else x)

applymap函数将函数应用于数据帧的每个单元格。

秦琦
2023-03-14

如果你想用空格替换空字符串和记录,正确答案是!:

df = df.replace(r'^\s*$', np.nan, regex=True)

公认的答案

df.replace(r'\s+', np.nan, regex=True)

不替换空字符串!,您可以尝试使用稍微更新的给定示例:

df = pd.DataFrame([
    [-0.532681, 'foo', 0],
    [1.490752, 'bar', 1],
    [-1.387326, 'fo o', 2],
    [0.814772, 'baz', ' '],     
    [-0.222552, '   ', 4],
    [-1.176781,  'qux', ''],         
], columns='A B C'.split(), index=pd.date_range('2000-01-01','2000-01-06'))

请注意,“fo o”虽然包含空格,但并未替换为Nan。进一步注意,一个简单的方法是:

df.replace(r'', np.NaN)

也不起作用-试试看。

年凯康
2023-03-14

我认为df.replace()起作用,因为熊猫0.13:

df = pd.DataFrame([
    [-0.532681, 'foo', 0],
    [1.490752, 'bar', 1],
    [-1.387326, 'foo', 2],
    [0.814772, 'baz', ' '],     
    [-0.222552, '   ', 4],
    [-1.176781,  'qux', '  '],         
], columns='A B C'.split(), index=pd.date_range('2000-01-01','2000-01-06'))

# replace field that's entirely space (or empty) with NaN
print(df.replace(r'^\s*$', np.nan, regex=True))

生产:

                   A    B   C
2000-01-01 -0.532681  foo   0
2000-01-02  1.490752  bar   1
2000-01-03 -1.387326  foo   2
2000-01-04  0.814772  baz NaN
2000-01-05 -0.222552  NaN   4
2000-01-06 -1.176781  qux NaN

正如Temak所指出的,使用df.replace(r'^\s$',np.nan,regex=True),以防您的有效数据包含空白。

 类似资料:
  • 我想找到熊猫数据框中包含空白(任意数量)的所有值,并用NaN替换这些值。 有什么想法可以改进吗? 基本上,我想把这个转变为: 为此: 我已经设法做到了下面的代码,但人是丑陋的。这不是蟒蛇,我肯定这也不是对熊猫最有效的利用。我循环遍历每一列,并对应用一个函数生成的列掩码进行布尔替换,该函数对每个值进行正则表达式搜索,并在空格上进行匹配。 只需遍历可能包含空字符串的字段,即可对其进行一点优化: 但这算

  • 问题内容: 我有一个Pandas Dataframe,如下所示: 我想用一个空字符串删除NaN值,使其看起来像这样: 问题答案: 这可能会有所帮助。它将用空字符串替换所有NaN。

  • 我有一个空单元格的数据框,并希望用NaN替换这些空单元格。之前在这个论坛上提出的解决方案有效,但前提是单元格包含一个空间: 当单元格为空时,此代码不起作用。有人建议用熊猫代码来代替空细胞吗?

  • 我有一个数据框,如下所示: 我想用一个空字符串删除NaN值,这样看起来像这样:

  • 问题内容: 我正在尝试学习熊猫,但请对以下内容感到困惑。我想用行平均值替换NaN是一个数据框。因此,类似的东西应该可以工作,但是由于某种原因,它对我来说是失败的。我是否想念任何东西,我做错了什么?是因为其未执行; 但是这样的事情看起来很好 问题答案: 如评论所述,fillna的axis参数为NotImplemented。 注意:这在这里很重要,因为您不想用第n行平均值填写第n列。 现在,您需要遍历

  • 2020-02-29 20:20:15,548错误O.A.J.E.JSR223PostProcessor:JSR223脚本中的问题,RESPONSE_STORE javax.script.scriptexception:groovy.lang.missingmethodException:org.codehaus.groovy.JSR223.groovyscriptengineimpl.$()方法