开发者

Pandas数据填充的具体实现

目录
  • 前言
  • 填充
    • 常数填充
    • Series填充
    • 附近值填充
      • 前向填充: 使用上一行的值
      • 后向填充: 使用后一行的值
      • 同一行中指定列值进行填充
  • 插值
    • 线性插值
      • 时间序列插值

      前言

      在数据分析与预处理过程中,脏数据几乎不可避免,这直接影响到后续分析http://www.devze.com的准确性和可靠性。清洗数据中最常见的就是处理空值。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, 88python], '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  javascript  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数据填充内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!

      0

      上一篇:

      下一篇:

      精彩评论

      暂无评论...
      验证码 换一张
      取 消

      最新开发

      开发排行榜