Python 如何解决用“无”填充所有值的问题?

Python 如何解决用“无”填充所有值的问题?,python,python-3.x,pandas,dataframe,missing-data,Python,Python 3.x,Pandas,Dataframe,Missing Data,我正在尝试填充数据框中缺少的值,但是所有值都替换为无 以下是我尝试过的示例: # 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

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

以下是我尝试过的示例:

# 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)

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

至于None值,它们来自返回None的函数,因为它在原地,没有什么可返回的。因此,所有值都变为无


对于每一列

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

PS:对于未来的用户,--避免就地填充,因为如果您想向前填充,您只需执行以下操作:

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', 'Third']
df1.loc[:, columns_to_fillna].ffill(inplace=True)
此处讨论了不建议使用inplace的原因:

您已经在原地指定,无需再次赋值。这可能是个问题。df1.loc[:,list_columns].fillna(value,inplace=True)应该足够了。请不要这样编写代码!只需直接访问该列
df1['First']=df1['First'].fillna(method='ffill')
或更好的方法:
df1['First']=df1['First'].ffill()
。一般的经验法则是,如果确实需要,只使用
inplace=True
。如果您经常使用
inplace=True
,您将来可能会遇到一些不可预见的问题,可能不是此代码,而是其他代码。如果您使用多列,
loc
。你也可以做
df[list\u columns]=df[list\u columns].fillna()
@DavidErickson谢谢你的评论。但是,最后一个命令
df[list\u columns]=df[list\u columns].fillna()
未成功运行,问题仍在发生。此外,我还想使用
inplace=True
。那么,还有其他建议吗?谢谢你的评论。它工作得很好,但是如何填充特定列中缺少的值呢?我非常感谢您的帮助。但是,实际上,我需要使用
inplace=True
,因为我需要将效果直接反映到数据帧。我可以使用您的解决方案,但我需要一个额外的命令来将这些更改反映到原始数据帧中。如果有这样的解决方案,我会考虑您的。@QaddomiObaid请查看此答案,了解您为什么应该避免
inplace=True
:Thx@DavidErickson我再次更新了我的答案,使用了您的评论:)@DavidErickson非常感谢。我阅读了附件中的链接,现在我明白了这个问题。但是,有没有这样的技巧来反映对原始数据帧的更改,而不是使用
inplace=True
?也许你喜欢用复印件?我确实需要更改才能对主数据帧生效,因为会对主数据帧进行一系列后续更改。我是一个初学者,我需要一个专家的建议。谢谢你的评论。它工作得很好,但是我真的很有兴趣为列列表填充缺少的数据?非常感谢。这是一个很好的解决方案
columns_to_fillna = ['Second', 'Third']
df1.loc[:, columns_to_fillna].ffill(inplace=True)