如何解决用None填充所有值的问题?

问题描述

我正在尝试在数据框中填充缺少的值,但是所有值None替换。

这是我尝试过的示例:

# Basic libraries
import os
import pandas as pd
import numpy as np

# Visualization libraries
import matplotlib.pyplot as plt
import seaborn as sns
import folium
#import folium.plugins as plugins
from wordcloud import WordCloud
import plotly.express as px

data_dict = {'First':[100,90,np.nan,95],'Second': [30,45,56,np.nan],'Third':[np.nan,40,80,98]} 
  
#reating a dataframe from list 
df1 = pd.DataFrame(data_dict)

#first_try_with_column_name
df1.loc[:,'First'] = df1.loc[:,'First'].fillna(method='ffill',inplace=True)

#Second_try_Using_List_of_Columns
list_columns = ['First','Second','Third']
df1.loc[:,list_columns] = df1.loc[:,list_columns].fillna(value,inplace=True)
df1

如图所示,我使用多种方法来了解此问题的原因,因此我尝试使用列名,然后使用列名列表,但不幸的是,问题是相同的。

请问有什么建议吗?

解决方法

更改

df1.loc[:,'First'] = df1.loc[:,'First'].fillna(method='ffill',inplace=True)

df1.loc[:,inplace=True)

这是因为您使用的是inplace = True,这意味着将对原始数据帧进行更改。

对于None值,它们来自函数,因为它就位返回None,没有任何返回值。因此,所有值都变为None。


对于每一列,

for col in df1.columns:
    df1[col].fillna(10,inplace=True)
df1

PS:对于将来的用户,请避免就地使用,因为In pandas,is inplace = True considered harmful,or not?

,

如果要转发填充,您可以执行以下操作:

df1 = df1.ffill()

结果是:

    First   Second  Third
0   100.0   30.0    NaN
1   90.0    45.0    40.0
2   90.0    56.0    80.0
3   95.0    56.0    98.0

仍有一个nan值,所以我们仍然可以回填:

df1 = df1.bfill()

最终结果:

    First   Second  Third
0   100.0   30.0    40.0
1   90.0    45.0    40.0
2   90.0    56.0    80.0
3   95.0    56.0    98.0

如果您只想转发特定列中的na,请使用以下内容。请注意,我没有使用inplace=True。这就是为什么您的代码以前无法工作的原因。

columns_to_fillna = ['Second','Third']
df1.loc[:,columns_to_fillna] = df1.loc[:,columns_to_fillna].ffill()

如果您确实要使用inplace=True(不建议这样做),请执行以下操作:

columns_to_fillna = ['Second',columns_to_fillna].ffill(inplace=True)

在这里讨论为什么不建议就地使用的原因:
https://stackoverflow.com/a/60020384/6366770