如果Pandas中一列的所有值都是null,则填充fillna。

4
我必须只填充一个列,当该列的所有值都为null时。例如c。
df = pd.DataFrame(data = {"col1":[3, np.nan, np.nan, 21, np.nan],
                          "col2":[4, np.nan, 12, np.nan, np.nan],
                          "col3":[33, np.nan, 55, np.nan, np.nan],
                          "col4":[np.nan, np.nan, np.nan, np.nan, np.nan]})


>>> df
   col1  col2  col3  col4
0   3.0   4.0  33.0   NaN
1   NaN   NaN   NaN   NaN
2   NaN  12.0  55.0   NaN
3  21.0   NaN   NaN   NaN
4   NaN   NaN   NaN   NaN


在上面的示例中,由于所有值都为null/NaN,我必须将col4的值替换为100。
因此,对于上面的示例,我需要得到以下输出。
   col1  col2  col3  col4
0   3.0   4.0  33.0   100
1   NaN   NaN   NaN   100
2   NaN  12.0  55.0   100
3  21.0   NaN   NaN   100
4   NaN   NaN   NaN   100

尝试使用以下命令,但只有列中至少包含1个非NaN值时才替换该列的值。 df.where(df.isnull().all(axis=1), df.fillna(100), inplace=True) 请问如何处理无论是否存在NaN值都替换该列的所有值?
谢谢。
5个回答

2

警告: OP修改了问题并提供了更多关于预期输出的细节,因此本答案已不再有效。

你几乎做到了;)

df['col4'] = df['col4'].mask(df.isnull().all(axis=1), 100)

您的错误:

  • 您使用了where,因此应该反转您的条件(我使用mask作为替代)
  • 您只需要一个标量作为替换
  • 您只需要在'col4'上应用操作

输出:

       col1      col2      col3      col4
0    3.0000    4.0000   33.0000       NaN
1       NaN       NaN       NaN  100.0000
2       NaN   12.0000   55.0000       NaN
3   21.0000       NaN       NaN       NaN
4       NaN       NaN       NaN  100.0000

谢谢您的迅速回复。问题是我将收到一个AVRO文件,其中列数可能超过50个,因此不能为每个列进行操作。请问是否可以不引用列名称来完成此操作。再次感谢。 - Subba
你能提供一个简短的例子和预期输出吗? - mozway

2
使用索引:
df.loc[:, df.isna().all()] = 100
print(df)

# Output:
   col1  col2  col3   col4
0   3.0   4.0  33.0  100.0
1   NaN   NaN   NaN  100.0
2   NaN  12.0  55.0  100.0
3  21.0   NaN   NaN  100.0
4   NaN   NaN   NaN  100.0

2
这个命令应该有所帮助:
df.loc[:, df.isnull().all(axis=0)] = 100

输出:

    col1    col2    col3    col4
0   3.0     4.0     33.0    100.0
1   NaN     NaN     NaN     100.0
2   NaN     12.0    55.0    100.0
3   21.0    NaN     NaN     100.0
4   NaN     NaN     NaN     100.0

1

如果您有多列都有NaN,可以这样做:

In [717]: cols = df.columns[df.isna().all()]
In [718]: cols
Out[718]: Index(['col4'], dtype='object')

您可以一次替换多个列:

In [720]: df[cols] = 100

In [721]: df
Out[721]: 
   col1  col2  col3   col4
0   3.0   4.0  33.0  100.0
1   NaN   NaN   NaN  100.0
2   NaN  12.0  55.0  100.0
3  21.0   NaN   NaN  100.0
4   NaN   NaN   NaN  100.0

1
使用 loc 访问器更新任何没有所有值的行。
 df.loc[:,~df.notna().any()]=100

输出

col1  col2  col3   col4
0   3.0   4.0  33.0  100.0
1   NaN   NaN   NaN  100.0
2   NaN  12.0  55.0  100.0
3  21.0   NaN   NaN  100.0
4   NaN   NaN   NaN  100.0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接