前言
在数据分析与预处理过程中,脏数据几乎不可避免,这直接影响到后续分析的准确性和可靠性。清洗数据中最常见的就是处理空值。pandas df的数据填充功能非常强大。本文介绍pandas中常用的几种数据填充(也称为缺失值处理)方法,使数据清洗工作更加高效。
填充
fillna()是pandas中最基础也是最灵活的填充缺失值方法。它允许你用特定的值、series、dataframe或前一个/后一个非空值来填充缺失值(nan)。
常数填充
in [1]: import pandas as pd
in [2]: import numpy as np
in [3]: data = {'a': [1, 2, np.nan], 'b': [5, np.nan, np.nan], 'c': [1, 2, 3]}
in [4]: df = pd.dataframe(data)
in [5]: df
out[5]:
a b c
0 1.0 5.0 1
1 2.0 nan 2
2 nan nan 3
in [6]: df.fillna(0)
out[6]:
a b c
0 1.0 5.0 1
1 2.0 0.0 2
2 0.0 0.0 3series填充
可以使用一个series对不同列使用不同的值进行填充, 具体如下:
fill_values = pd.series([10, 20, 30], index=['a', 'b', 'c'])
in [12]: df
out[12]:
a b c
0 1.0 5.0 1
1 2.0 nan 2
2 nan nan 3
in [13]: df.fillna(fill_values)
out[13]:
a b c
0 1.0 5.0 1
1 2.0 20.0 2
2 10.0 20.0 3附近值填充
前向填充: 使用上一行的值
in [18]: df
out[18]:
a b c
0 1.0 5.0 1
1 2.0 nan 2
2 nan nan 3
in [19]: df.ffill()
out[19]:
a b c
0 1.0 5.0 1
1 2.0 5.0 2
2 2.0 5.0 3后向填充: 使用后一行的值
in [22]: data = {'a': [1, 2, np.nan], 'b': [5, np.nan, 88], 'c': [1, 2, 3]}
in [23]: df = pd.dataframe(data)
in [24]: df
out[24]:
a b c
0 1.0 5.0 1
1 2.0 nan 2
2 nan 88.0 3
in [25]: df.bfill()
out[25]:
a b c
0 1.0 5.0 1
1 2.0 88.0 2
2 nan 88.0 3同一行中指定列值进行填充
in [28]: df
out[28]:
a b c
0 1.0 5.0 1
1 2.0 nan 2
2 nan 88.0 3
in [29]: df['a']=df.apply(lambda row: row['c'] if pd.isnull(row['a']) else row['a'], axis=1)
in [30]: df
out[30]:
a b c
0 1.0 5.0 1
1 2.0 nan 2
2 3.0 88.0 3
插值
插值法是一个非常有用的功能,通过插值进行填充可以保证一些时序数值相对合理和连续。这特别能够避免一些因为数据丢失原因产生的跳空出现。
线性插值
in [2]: data = {'a': [1, 2, np.nan, 4], 'b': [np.nan, 5, np.nan, 8]}
in [3]: df = pd.dataframe(data)
in [4]: df
out[4]:
a b
0 1.0 nan
1 2.0 5.0
2 nan nan
3 4.0 8.0
in [5]: df.interpolate()
out[5]:
a b
0 1.0 nan
1 2.0 5.0
2 3.0 6.5
3 4.0 8.0时间序列插值
当df使用datetime作为索引时,支持基于时间的插值,如下代码给出了示例:
in [11]: date_index = pd.date_range(start='2024-06-25', periods=7, freq='d')
in [12]: dates_to_remove = pd.to_datetime(['2024-06-26', '2024-06-30'])
in [13]: date_index = date_index[~date_index.isin(dates_to_remove)]
in [14]: date_index
out[14]:
datetimeindex(['2024-06-25', '2024-06-27', '2024-06-28', '2024-06-29',
'2024-07-01'],
dtype='datetime64[ns]', freq=none)
in [15]: data_ts = {'value': [1, 2, np.nan, np.nan, 8]}
in [16]: pd.dataframe(data_ts, index=date_index)
out[16]:
value
2024-06-25 1.0
2024-06-27 2.0
2024-06-28 nan
2024-06-29 nan
2024-07-01 8.0
# 对比普通线性插值和时间序列插值
in [17]: pd.dataframe(data_ts, index=date_index).interpolate()
out[17]:
value
2024-06-25 1.0
2024-06-27 2.0
2024-06-28 4.0
2024-06-29 6.0
2024-07-01 8.0
in [18]: pd.dataframe(data_ts, index=date_index).interpolate(method='time')
out[18]:
value
2024-06-25 1.0
2024-06-27 2.0
2024-06-28 3.5
2024-06-29 5.0
2024-07-01 8.0pandas的插值函数基于scipy.interpolate.interp1d — scipy v1.13.1 manual, 同时也支持scipy的几个‘zero’, ‘slinear’, ‘quadratic’, ‘cubic’, ‘barycentric’, ‘polynomial等不同的插值类型。具体不同插值类型可以在遇到需要的时候,深入阅读文档研究,本文不在重复赘述。
到此这篇关于pandas数据填充的具体实现的文章就介绍到这了,更多相关pandas数据填充内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论