翼度科技»论坛 编程开发 python 查看内容

【pandas小技巧】--缺失值的列

8

主题

8

帖子

24

积分

新手上路

Rank: 1

积分
24
在实际应用中,数据集中经常会存在缺失值,也就是某些数据项的值并未填充或者填充不完整。
缺失值的存在可能会对后续的数据分析和建模产生影响,因此需要进行处理。
pandas提供了多种方法来处理缺失值,例如删除缺失值、填充缺失值等。
删除缺失值可能会导致数据量减少,填充缺失值则能够尽量保留原始数据集的完整性,从而提高数据分析和建模的准确性和可靠性。
当数据集中存在缺失值时,我们通常需要进行以下操作:

  • 检查缺失值的数量和分布情况,了解缺失值对数据的影响程度。
  • 根据数据的类型和业务需求,选择合适的缺失值处理方法,并对缺失值进行处理。
  • 在处理缺失值的同时,要注意保持数据集的一致性和完整性。
  • 处理完缺失值后,可以进行后续的数据分析和建模,从而得出更准确和可靠的结论。
1. 缺失值统计

首先我们随机创建一个包含缺失值的测试数据集,这里用到之前介绍过的创建测试数据的技巧。
  1. import pandas as pd
  2. def get_random_missing_data():
  3.     df = pd.util.testing.makeMissingDataframe()
  4.     return df[df.isna().any(axis=1)]
  5. df = get_random_missing_data()
  6. df
复制代码

这里我封装了一个简单的函数get_random_missing_data,通过这个函数,可以创建一个每行至少有一个缺失值的数据集。
注意:这是随机创建的数据集,所以每次运行的结果会不一样。
统计缺失值很简单,首先通过isna函数找出所有缺失的值,然后可以使用sum或者mean来统计缺失的数量和比例。
  1. df.isna().sum()
复制代码

sum函数返回的是每一列缺失值的数量。
  1. df.isna().mean()
复制代码

mean函数返回的值可以看做每一列缺失值占的比例。
2. 删除缺失值

处理缺失值时,有些场景为了保证数据的完整性,只能删掉有缺失的数据。
删除缺失值有2个重要的参数:how 和 axis。
how有2个可选值:

  • any:这是默认值,表示行数据或者列数据中有一个缺失值,就删除此行或此列
  • all:表示行数据或者列数据中所有值都缺失时,才删除此行或此列
axis也有2个可选值:

  • 0 或 index:按行判断是否有缺失值
  • 1 或 columns:按列判断是否有缺失值
how="any",axis=0的情况:每数据中只要有一个缺失值就删除该
  1. df = pd.DataFrame(
  2.     {
  3.         "A": [1, 2, 3, np.nan],
  4.         "B": [1, np.nan, 3, 4],
  5.         "C": [1, 2, np.nan, 4],
  6.         "D": [1, 2, 3, 4],
  7.     }
  8. )
  9. df.dropna(how="any", axis=0)
复制代码

how="all",axis=0的情况:每数据中,全部值都缺失的才删除。
  1. df = pd.DataFrame(
  2.     {
  3.         "A": [1, np.nan, 3, np.nan],
  4.         "B": [1, np.nan, 3, 4],
  5.         "C": [1, np.nan, np.nan, 4],
  6.         "D": [1, np.nan, 3, 4],
  7.     }
  8. )
  9. df.dropna(how="all", axis=0)
复制代码

how="any",axis=1的情况:每数据中只要有一个缺失值就删除该
  1. df = pd.DataFrame(
  2.     {
  3.         "A": [1, 2, 3, np.nan],
  4.         "B": [1, np.nan, 3, 4],
  5.         "C": [1, 2, np.nan, 4],
  6.         "D": [1, 2, 3, 4],
  7.     }
  8. )
  9. df.dropna(how="any", axis=1)
复制代码

how="all",axis=1的情况:每数据中,全部值都缺失的才删除。
  1. df = pd.DataFrame(
  2.     {
  3.         "A": [np.nan, np.nan, np.nan, np.nan],
  4.         "B": [1, np.nan, 3, 4],
  5.         "C": [1, 2, np.nan, 4],
  6.         "D": [1, np.nan, 3, 4],
  7.     }
  8. )
  9. df.dropna(how="all", axis=1)
复制代码

3. 填充缺失值

填充缺失值一般使用fillna函数指定填充什么样的值。
比如:
  1. df = pd.DataFrame(
  2.     {
  3.         "A": [1, 2, 3, np.nan],
  4.         "B": [1, np.nan, 3, 4],
  5.         "C": [1, 2, np.nan, 4],
  6.         "D": [1, 2, 3, 4],
  7.     }
  8. )
  9. df.fillna(-1)
复制代码

这里是用 -1 来填充的,根据实际情况可以使用任意合适的值来填充。
除了 fillna 函数之外,还有一个interpolate函数,能够更加合理的填充缺失值。
  1. df = pd.DataFrame(
  2.     {
  3.         "A": [1, 3, 4, np.nan],
  4.         "B": [2, np.nan, 2, 4],
  5.         "C": [3, 3, np.nan, 3],
  6.         "D": [4, 1, np.nan, 4],
  7.     }
  8. )
  9. df.interpolate()
复制代码

每个缺失值都是它上下两行的值的平均值
如果只有上面行的值,那就直接用上面行的值。
这里有个注意的地方:如果是第一行有缺失的话,那么是无法填充的。
比如:
  1. df = pd.DataFrame(
  2.     {
  3.         "A": [np.nan, 3, np.nan, np.nan],
  4.         "B": [2, np.nan, 2, 4],
  5.         "C": [3, 3, np.nan, 3],
  6.         "D": [4, 1, np.nan, 4],
  7.     }
  8. )
  9. df.interpolate()
复制代码

第一行的缺失值没有上一行可以参照,还是维持原来缺失的状态。
所以使用 interpolate 进行填充时,注意第一行的缺失值状态,可以用 fillna 先处理第一行。

来源:https://www.cnblogs.com/wang_yb/p/17610655.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具