哎,你说搞数据分析,最头疼的是啥?八成就是那堆缺失值!看着一堆 NaN 或者 None 杵在那儿,感觉代码都写不下去了。别慌,今天就来聊聊 Python 怎么填充这些坑,让你填得又快又好。
最最基础的,肯定是简单粗暴的填充。比如说,你想把所有空值都变成 0,那就直接:
“`python
import pandas as pd
import numpy as np
创建一个包含缺失值的 DataFrame
data = {‘col1’: [1, 2, np.nan, 4, 5],
‘col2’: [6, np.nan, 8, 9, 10],
‘col3’: [11, 12, 13, np.nan, 15]}
df = pd.DataFrame(data)
df.fillna(0, inplace=True) #直接填充
print(df)
“`
fillna()
这个函数是 Pandas 的神器,第一个参数就是你想填进去的值。inplace=True
意思就是直接修改原始的 DataFrame,不用再赋值给一个新的变量了,懒人必备!
不过,直接填 0 有时候不太靠谱。想象一下,你的数据是房价,你把空着的房价都填成 0,那模型肯定得跑偏啊!所以,更常用的方法是均值填充或者中位数填充。
“`python
均值填充
df = pd.DataFrame(data) # 重新加载数据
df[‘col1’].fillna(df[‘col1’].mean(), inplace=True)
中位数填充
df[‘col2’].fillna(df[‘col2’].median(), inplace=True)
print(df)
“`
用 mean()
算平均值,用 median()
算中位数,然后再填进去,是不是感觉专业多了?
但有时候,更精细的活儿还得靠向前填充和向后填充。啥意思呢?就是用缺失值前面的值或者后面的值来填。
“`python
df = pd.DataFrame(data) # 重新加载数据
向前填充
df.fillna(method=’ffill’, inplace=True) #ffill 是 forward fill 的缩写
print(df)
df = pd.DataFrame(data) # 重新加载数据
向后填充
df.fillna(method=’bfill’, inplace=True) #bfill 是 backward fill 的缩写
print(df)
“`
想象一下,你有个时间序列数据,记录的是每天的温度。如果某一天的数据丢了,用前一天的温度或者后一天的温度来估计,是不是比填 0 或者均值靠谱?
再说点高级的,插值填充。这玩意儿就厉害了,它会根据已有的数据点,用数学公式(比如线性插值、多项式插值)来估算出缺失值。
“`python
df = pd.DataFrame(data) # 重新加载数据
df.interpolate(inplace=True)
print(df)
可以指定差值方法,例如线性插值
df.interpolate(method=’linear’, inplace=True)
“`
interpolate()
函数就是干这个的,它默认用线性插值,你也可以指定其他方法。这种方法适合数据变化比较平滑的情况,填出来的空值更自然。
哎,等等,是不是忘了点啥?如果你的数据是分类变量,比如颜色、性别、地区等等,那可不能用均值或者中位数来填啊!这时候,可以用众数填充,也就是用出现次数最多的类别来填。
“`python
创建一个包含分类变量和缺失值的 DataFrame
data = {‘col1’: [‘A’, ‘B’, np.nan, ‘A’, ‘C’],
‘col2’: [1, 2, 3, np.nan, 5]}
df = pd.DataFrame(data)
众数填充
df[‘col1’].fillna(df[‘col1’].mode()[0], inplace=True) #mode()返回的是一个Series,取第一个值才是众数
print(df)
“`
mode()
函数可以找出 DataFrame 里出现次数最多的值,然后填进去就行了。
还有一种更骚气的操作,就是用模型预测来填充缺失值。你可以用机器学习模型(比如回归模型、分类模型)来预测缺失值,这需要你把包含缺失值的列当成目标变量,其他列当成特征,训练一个模型,然后用这个模型来预测缺失值。这种方法比较复杂,但效果也往往最好。
但话说回来,填空不是万能的。有时候,与其费劲巴拉地填空,还不如直接把包含缺失值的行或者列给删了。当然,这得看你的数据量和缺失值的比例。如果缺失值太多,或者删除会导致数据严重失真,那还是得老老实实地填空。
总结一下,Python 怎么填充缺失值的方法有很多,你需要根据数据的类型、缺失的比例以及你的业务需求来选择合适的方法。记住,没有最好的方法,只有最适合的方法。填空也是一门艺术,需要你不断地尝试和探索,才能找到最完美的解决方案。填充的时候,一定要结合你的数据和背景知识,想想这个值合不合理,有没有可能引入新的偏差。别盲目地用代码,多动动脑子! 哎,写了这么多,希望对你有帮助吧!
评论(0)