当前位置: 代码网 > it编程>前端脚本>Python > Pandas数据填充的具体实现

Pandas数据填充的具体实现

2024年07月26日 Python 我要评论
前言在数据分析与预处理过程中,脏数据几乎不可避免,这直接影响到后续分析的准确性和可靠性。清洗数据中最常见的就是处理空值。pandas df的数据填充功能非常强大。本文介绍pandas中常用的几种数据填

前言

在数据分析与预处理过程中,脏数据几乎不可避免,这直接影响到后续分析的准确性和可靠性。清洗数据中最常见的就是处理空值。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  3

series填充

可以使用一个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.0

pandas的插值函数基于scipy.interpolate.interp1d — scipy v1.13.1 manual, 同时也支持scipy的几个‘zero’, ‘slinear’, ‘quadratic’, ‘cubic’, ‘barycentric’, ‘polynomial等不同的插值类型。具体不同插值类型可以在遇到需要的时候,深入阅读文档研究,本文不在重复赘述。

到此这篇关于pandas数据填充的具体实现的文章就介绍到这了,更多相关pandas数据填充内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com