Pandas中DataFrame中的nan值处理

2024-04-18 0 208
目录
  • 1. 方法简介
    • 1.1 DataFrame.dropna()
    • 1.2 .DataFrame.fillna()
  • 2. 案例
    • 2.1 删除全部为NaN的行
    • 2.2 删除包含NaN的行
    • 2.3 删除包含NaN的列
    • 2.4 删除全部为NaN的列
    • 2.5 删除指定列是NaN的行
    • 2.6 删除指定的两列都是空的行
    • 2.7 筛选出NaN的数据
    • 2.8 筛选出非NaN的数据
    • 2.9 替换NaN值
    • 2.10 多条件筛选
  • 总结

    1. 方法简介

    1.1 DataFrame.dropna()

    DataFrame.dropna()方法的作用:是删除含用空值或缺失值得行或列。语法为:dropna(axis=0,how=‘any’,thresh=None,subset=None,inplace=False)参数:

    • axis:确定过滤的行或列,取值可以为(1) 0或index:删除包含缺失值的行,默认为0。(2) 1或columns:删除包含缺失值的列。
    • how:确定过滤的标准,取值可以为:(1)any:默认值,如果存在NaN值,就删除该行或该列。//有一个就删除行或列(2)all:如果所有值都是NaN值,就删除该行或该列。 //全部都是才删除行或列
    • thresh:表示有效数据量的最小要求,比如thresh=3,要求该行或该列至少有三个不是NaN值时将其保留。
    • subset:表示在特定的字集中寻找NaN值
    • inplace:表示是否在原数据上操作,如果设为True,则表示直接修改原数据;如果设为False,则表示修改原数据的副本,返回新数据

    1.2 .DataFrame.fillna()

    语法为:fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None, **kwargs)参数:

    • value:用于填充的空值的值。
    • method: {‘backfill’, ‘bfill’, ‘pad’, ‘ffill’, None}, default None。定义了填充空值的方法, pad / ffill表示用前面行/列的值,填充当前行/列的空值, backfill / bfill表示用后面行/列的值,填充当前行/列的空值。
    • axis:轴。0或’index’,表示按行删除;1或’columns’,表示按列删除。
    • inplace:是否原地替换。布尔值,默认为False。如果为True,则在原DataFrame上进行操作,返回值为None。
    • limit:int, default None。如果method被指定,对于连续的空值,这段连续区域,最多填充前 limit 个空值(如果存在多段连续区域,每段最多填充前 limit 个空值)。如果method未被指定, 在该axis下,最多填充前 limit 个空值(不论空值连续区间是否间断)
    • downcast:dict, default is None,字典中的项为,为类型向下转换规则。或者为字符串“infer”,此时会在合适的等价类型之间进行向下转换,比如float64 to int64 if possible。

    2. 案例

    import pandas as pd
    import numpy as np
    df = pd.DataFrame(np.arange(32).reshape(8, 4), columns=list(\”abcd\”))
    df.loc[1, \’a\’] = 2
    df.loc[1, \’c\’] = 2.0
    df.loc[6, \’c\’] = np.nan
    df.loc[3, \’c\’] = 10
    df.loc[3, [\’c\’, \’d\’]] = np.nan
    df[\”year\”] = \’2023\’
    df[\”date\”] = [\’08-25\’,\’08-26\’,\’08-27\’,\’08-28\’,\’08-29\’,\’08-30\’,\’08-31\’,\’09-01\’]
    # 合并数据
    df[\”ydate\”] =df[\”year\”].map(str) +\”-\”+ df[\”date\”].map(str)
    df[\”高温\”] = [\’15°\’, \’16°\’, \’20°\’, \’19°\’, \’20°\’, \’22°\’, \’24°\’, \’23°\’]
    df[\”低温\”] = [\’10°\’, \’11°\’, \’18°\’, \’17°\’, \’10°\’, \’18°\’, \’20°\’, \’17°\’]
    df[\”空气质量\”] = [\’优\’, \’良\’, \’优\’, \’优\’, \’差\’, \’良\’, \’优\’, np.nan]
    print(df)

    a b c d year date ydate 高温 低温 空气质量0 0 1 2.0 3.0 2023 08-25 2023-08-25 15° 10° 优1 2 5 2.0 7.0 2023 08-26 2023-08-26 16° 11° 良2 8 9 10.0 11.0 2023 08-27 2023-08-27 20° 18° 优3 12 13 NaN NaN 2023 08-28 2023-08-28 19° 17° 优4 16 17 18.0 19.0 2023 08-29 2023-08-29 20° 10° 差5 20 21 22.0 23.0 2023 08-30 2023-08-30 22° 18° 良6 24 25 NaN 27.0 2023 08-31 2023-08-31 24° 20° 优7 28 29 30.0 31.0 2023 09-01 2023-09-01 23° 17° NaN

    2.1 删除全部为NaN的行

    df1 = df.copy()
    df1.loc[8, :] = np.nan
    df1

    a b c d year date ydate 高温 低温 空气质量0 0.0 1.0 2.0 3.0 2023 08-25 2023-08-25 15° 10° 优1 2.0 5.0 2.0 7.0 2023 08-26 2023-08-26 16° 11° 良2 8.0 9.0 10.0 11.0 2023 08-27 2023-08-27 20° 18° 优3 12.0 13.0 NaN NaN 2023 08-28 2023-08-28 19° 17° 优4 16.0 17.0 18.0 19.0 2023 08-29 2023-08-29 20° 10° 差5 20.0 21.0 22.0 23.0 2023 08-30 2023-08-30 22° 18° 良6 24.0 25.0 NaN 27.0 2023 08-31 2023-08-31 24° 20° 优7 28.0 29.0 30.0 31.0 2023 09-01 2023-09-01 23° 17° NaN8 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN

    df1 = df.dropna(axis=0, how=\’all\’)
    df1

    abcdyeardateydate高温低温空气质量00.01.02.03.0202308-252023-08-2515°10°优12.05.02.07.0202308-262023-08-2616°11°良28.09.010.011.0202308-272023-08-2720°18°优312.013.0NaNNaN202308-282023-08-2819°17°优416.017.018.019.0202308-292023-08-2920°10°差520.021.022.023.0202308-302023-08-3022°18°良624.025.0NaN27.0202308-312023-08-3124°20°优728.029.030.031.0202309-012023-09-0123°17°NaN

    2.2 删除包含NaN的行

    df2 = df.dropna(axis=0, how=\’any\’)
    df2

    abcdyeardateydate高温低温空气质量00.01.02.03.0202308-252023-08-2515°10°优12.05.02.07.0202308-262023-08-2616°11°良28.09.010.011.0202308-272023-08-2720°18°优416.017.018.019.0202308-292023-08-2920°10°差520.021.022.023.0202308-302023-08-3022°18°良

    2.3 删除包含NaN的列

    df3 = df.dropna(axis=1, how=\’any\’)
    df3

    abyeardateydate高温低温001202308-252023-08-2515°10°125202308-262023-08-2616°11°289202308-272023-08-2720°18°31213202308-282023-08-2819°17°41617202308-292023-08-2920°10°52021202308-302023-08-3022°18°62425202308-312023-08-3124°20°72829202309-012023-09-0123°17°

    2.4 删除全部为NaN的列

    df4 = df.copy()
    df4[\”unknow\”] = np.nan
    df4

    abcdyeardateydate高温低温空气质量unknow0012.03.0202308-252023-08-2515°10°优NaN1252.07.0202308-262023-08-2616°11°良NaN28910.011.0202308-272023-08-2720°18°优NaN31213NaNNaN202308-282023-08-2819°17°优NaN4161718.019.0202308-292023-08-2920°10°差NaN5202122.023.0202308-302023-08-3022°18°良NaN62425NaN27.0202308-312023-08-3124°20°优NaN7282930.031.0202309-012023-09-0123°17°NaNNaN

    df4 = df4.dropna(axis=1, how=\’all\’)
    df4

    abcdyeardateydate高温低温空气质量0012.03.0202308-252023-08-2515°10°优1252.07.0202308-262023-08-2616°11°良28910.011.0202308-272023-08-2720°18°优31213NaNNaN202308-282023-08-2819°17°优4161718.019.0202308-292023-08-2920°10°差5202122.023.0202308-302023-08-3022°18°良62425NaN27.0202308-312023-08-3124°20°优7282930.031.0202309-012023-09-0123°17°NaN

    2.5 删除指定列是NaN的行

    删除指定某一列有nan,这样即可定位到所在行的index,然后对该index进行drop操作即可

    df[np.isnan(df[\’c\’])].index #定位某一列是否有nan

    输出:

    Index([3, 6], dtype='int64')

    # 直接drop对应indx即可删除该行
    df5 = df.drop(df[np.isnan(df[\’c\’])].index)
    df5

    abcdyeardateydate高温低温空气质量0012.03.0202308-252023-08-2515°10°优1252.07.0202308-262023-08-2616°11°良28910.011.0202308-272023-08-2720°18°优4161718.019.0202308-292023-08-2920°10°差5202122.023.0202308-302023-08-3022°18°良7282930.031.0202309-012023-09-0123°17°NaN

    2.6 删除指定的两列都是空的行

    df6 = df.dropna(axis=0, how=\’all\’, subset=[\’c\’, \’d\’])
    df6

    abcdyeardateydate高温低温空气质量0012.03.0202308-252023-08-2515°10°优1252.07.0202308-262023-08-2616°11°良28910.011.0202308-272023-08-2720°18°优4161718.019.0202308-292023-08-2920°10°差5202122.023.0202308-302023-08-3022°18°良62425NaN27.0202308-312023-08-3124°20°优7282930.031.0202309-012023-09-0123°17°NaN

    2.7 筛选出NaN的数据

    df_nan = df[df[\’d\’].isna()]
    df_nan

    abcdyeardateydate高温低温空气质量31213NaNNaN202308-282023-08-2819°17°优

    2.8 筛选出非NaN的数据

    df_notnan = df[~df[\’d\’].isna()]
    df_notnan

    abcdyeardateydate高温低温空气质量0012.03.0202308-252023-08-2515°10°优1252.07.0202308-262023-08-2616°11°良28910.011.0202308-272023-08-2720°18°优4161718.019.0202308-292023-08-2920°10°差5202122.023.0202308-302023-08-3022°18°良62425NaN27.0202308-312023-08-3124°20°优7282930.031.0202309-012023-09-0123°17°NaN

    2.9 替换NaN值

    df9 = df.fillna(\’\’) # 将nan替换为\’\’
    df9

    abcdyeardateydate高温低温空气质量0012.03.0202308-252023-08-2515°10°优1252.07.0202308-262023-08-2616°11°良28910.011.0202308-272023-08-2720°18°优31213202308-282023-08-2819°17°优4161718.019.0202308-292023-08-2920°10°差5202122.023.0202308-302023-08-3022°18°良6242527.0202308-312023-08-3124°20°优7282930.031.0202309-012023-09-0123°17°

    2.10 多条件筛选

    nan_df = df[(df[\’高温\’].str.len() <= 2) | (df[\’空气质量\’].isna())]
    nan_df

    abcdyeardateydate高温低温空气质量7282930.031.0202309-012023-09-0123°17°NaN

    总结

    到此这篇关于Pandas中DataFrame中的nan值处理的文章就介绍到这了,更多相关Pandas DataFrame nan值内容请搜索悠久资源网以前的文章或继续浏览下面的相关文章希望大家以后多多支持悠久资源网!

    您可能感兴趣的文章:

    • 如何一分钟内找出pandasDataFrame某列中的nan值

    收藏 (0) 打赏

    感谢您的支持,我会继续努力的!

    打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
    点赞 (0)

    悠久资源 Python Pandas中DataFrame中的nan值处理 https://www.u-9.cn/jiaoben/python/186905.html

    常见问题

    相关文章

    发表评论
    暂无评论
    官方客服团队

    为您解决烦忧 - 24小时在线 专业服务