如何在 Pandas 的多列中填充 NA 值?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/36556256/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-14 01:01:47  来源:igfitidea点击:

How do I fill NA values in multiple columns in pandas?

pythonpandasdataframe

提问by Richard

I have a dataframe with 50 columns. I want to replace NAs with 0 in 10 columns.

我有一个包含 50 列的数据框。我想在 10 列中用 0 替换 NA。

What's the simplest, most readable way of doing this?

这样做的最简单、最易读的方法是什么?

I was hoping for something like:

我希望是这样的:

cols = ['a', 'b', 'c', 'd']
df[cols].fillna(0, inplace=True)

But that gives me ValueError: Must pass DataFrame with boolean values only.

但这给了我ValueError: Must pass DataFrame with boolean values only

I found this answer, but it's rather hard to understand.

我找到了这个答案,但很难理解。

回答by MaxU

you can use update():

您可以使用update()

In [145]: df
Out[145]:
    a   b   c  d  e
0 NaN NaN NaN  3  8
1 NaN NaN NaN  8  7
2 NaN NaN NaN  2  8
3 NaN NaN NaN  7  4
4 NaN NaN NaN  4  9
5 NaN NaN NaN  1  9
6 NaN NaN NaN  7  7
7 NaN NaN NaN  6  5
8 NaN NaN NaN  0  0
9 NaN NaN NaN  9  5

In [146]: df.update(df[['a','b','c']].fillna(0))

In [147]: df
Out[147]:
     a    b    c  d  e
0  0.0  0.0  0.0  3  8
1  0.0  0.0  0.0  8  7
2  0.0  0.0  0.0  2  8
3  0.0  0.0  0.0  7  4
4  0.0  0.0  0.0  4  9
5  0.0  0.0  0.0  1  9
6  0.0  0.0  0.0  7  7
7  0.0  0.0  0.0  6  5
8  0.0  0.0  0.0  0  0
9  0.0  0.0  0.0  9  5

回答by yaizer

In [15]: cols= ['one', 'two']
In [16]: df
Out[16]:
        one       two     three four   five
a -0.343241  0.453029 -0.895119  bar  False
b       NaN       NaN       NaN  NaN    NaN
c  0.839174  0.229781 -1.244124  bar   True
d       NaN       NaN       NaN  NaN    NaN
e  1.300641 -1.797828  0.495313  bar   True
f -0.182505 -1.527464  0.712738  bar  False
g       NaN       NaN       NaN  NaN    NaN
h  0.626568 -0.971003  1.192831  bar   True

In [17]: df[cols]=df[cols].fillna(0)

In [18]: df
Out[18]:
        one       two     three four   five
a -0.343241  0.453029 -0.895119  bar  False
b  0.000000  0.000000       NaN  NaN    NaN
c  0.839174  0.229781 -1.244124  bar   True
d  0.000000  0.000000       NaN  NaN    NaN
e  1.300641 -1.797828  0.495313  bar   True
f -0.182505 -1.527464  0.712738  bar  False
g  0.000000  0.000000       NaN  NaN    NaN
h  0.626568 -0.971003  1.192831  bar   True

回答by Yannis P.

And a version using column slicing which might be useful in your case:

以及使用列切片的版本,这可能对您的情况有用:

In [46]:
df

Out[46]:
    a   b   c   d   e
0   NaN NaN NaN 3   8
1   NaN NaN NaN 8   7
2   NaN NaN NaN 2   8
3   NaN NaN NaN 7   4
4   NaN NaN NaN 4   9
5   9   NaN NaN 1   9
6   NaN NaN NaN 7   7
7   NaN NaN NaN 6   5
8   NaN NaN NaN 0   0
9   NaN NaN NaN 9   5

In [47]:
df.loc[:,'a':'c'] = df.loc[:,'a':'c'].fillna(0)
df

Out[47]:
    a   b   c   d   e
0   0   0   0   3   8
1   0   0   0   8   7
2   0   0   0   2   8
3   0   0   0   7   4
4   0   0   0   4   9
5   9   0   0   1   9
6   0   0   0   7   7
7   0   0   0   6   5
8   0   0   0   0   0
9   0   0   0   9   5