Pandas的缺失值填充

在写例子的时候用到了缺失值的填充,于是想用一下method这个参数传入’ffill’来实现.
但是发现,这个填充方法并不全如我意.
仔细实验后发现,这其中有些需要注意的点.

fill_test = Series([111, 222, 533, 644, 299], index=[1, 2, 3, 7, 11])
print(fill_test)

fill_test_1 = fill_test.reindex(index=[1, 2, 3, 7, 11, 4], method='ffill')
print(fill_test_1)

fill_test_1[4] = 555
print(fill_test_1)

fill_test_2 = fill_test_1.sort_index().reindex(index=[1, 2, 3, 8], method='ffill')
print(fill_test_2)

fill_test_3 = fill_test_1.sort_index().reindex(index=[1, 2, 3, 8], method='nearest')
print(fill_test_3)    
fill_test_4 = fill_test_1.sort_index().reindex(index=[1, 2, 3, 9], method='nearest')
print(fill_test_4)

如上,你需要保证你的原始数据的index 是单调递增的.(值不影响)
当你在第二步添加了一个4以后,就改变了这一属性.
所以想要修改index,需要一个sort_index().
如果你reindex 的时候,填入的index也非单调递增的,则也需要使用sort_index()来排序保障.
另外补充的值是根据你原始数据集中的前向填充,即第四步中的8对应的值,是原数据中7对应的填充,而非对3对应数据的复制.
而第五步中,nearest方法则实现了最靠近的填充.原始数据中,有索引为7和索引为11的数据了.这时对索引为8和9的值进行填充,可以看到前一个显而易见,后一个则使用了索引为11的数据.
以上.

refer:
https://stackoverflow.com/questions/37982170/pandas-reindex-and-fill-missing-values-index-must-be-monotonic
https://stackoverflow.com/questions/31285508/valueerror-index-must-be-monotonic-increasing-or-decreasing
https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.reindex.html

### Pandas 中的缺失值填充方法 在数据预处理阶段,Pandas 提供了多种方式来处理缺失值。其中 `fillna()` 函数是最常用的工具之一,用于替换 DataFrame 或 Series 中的 NaN 值。 #### 使用固定值填充缺失值 可以使用单一值(如 0、1 等)或者自定义值来替代所有的缺失值。例如: ```python import pandas as pd import numpy as np data = pd.Series([1, np.nan, 2, None, 3], index=list('abcde')) filled_data = data.fillna(value=0) print(filled_data) ``` 上述代码会将所有缺失值替换为 0[^3]。 #### 使用统计量填充缺失值 除了固定的常数外,还可以通过计算列的均值、中位数或其他统计指标来进行填充。例如: ```python df = pd.DataFrame({ 'A': [1, 2, np.nan], 'B': [5, np.nan, np.nan], 'C': [7, 8, 9] }) mean_value = df['A'].mean() df['A'] = df['A'].fillna(mean_value) median_value = df['B'].median() df['B'] = df['B'].fillna(median_value) print(df) ``` 这里展示了如何利用均值和中位数分别填补两列中的缺失值。 #### 向前或向后填充 `fillna()` 还支持基于上下文关系的方法参数: - **method='ffill'**: 表示用上一个非空值向前填充当前缺失位置; - **method='bfill'**: 则是从下一个可用的数据点反方向回溯覆盖空白处。 以下是具体实例演示这两种模式的效果对比: ```python df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f','h']) df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']) # 向前填充 df_ffill = df.fillna(method='ffill') print("Forward Fill:") print(df_ffill) # 向后填充 df_bfill = df.fillna(method='bfill') print("\nBackward Fill:") print(df_bfill) ``` 以上操作分别实现了沿时间序列维度上的连续性修复策略[^4]。 #### 结合 limit 参数控制最大填充次数 当采用 ffill/bfill 方式时,可能并不希望无限延伸某个特定单元格的影响范围。此时可通过设置额外选项——limit 来约束允许的最大补全数量: ```python limited_df = df.fillna(method='ffill', limit=1) print(limited_df) ``` 此段脚本仅允许每列最多执行一次前进传播动作。 --- ### 总结 综上所述,在实际应用过程中可以根据业务需求灵活选用不同的技术手段完成对原始资料集里存在的 NULL/NA 类型项目的修正工作。无论是简单的全局统一赋值还是复杂的局部动态调整方案都能借助于强大的 Pandas 库轻松达成目标。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值