Pandas数据处理1、DataFrame删除NaN空值(dropna各种属性值控制超全)

举报
红目香薰 发表于 2023/02/13 16:51:43 2023/02/13
【摘要】 Pandas数据处理——渐进式学习 前言 环境 DataFrame删除NaN空值 dropna函数参数 测试数据 删除所有有空的行 axis属性值 how属性值 thres属性值 subset属性值 inplace是否复制副本 fillna测试

 


Pandas数据处理——渐进式学习


目录

Pandas数据处理——渐进式学习

前言

环境

DataFrame删除NaN空值

dropna函数参数

测试数据

删除所有有空的行

axis属性值

how属性值

thres属性值

subset属性值

inplace是否复制副本

fillna测试

总结



前言

        这个女娃娃是否有一种初恋的感觉呢,但是她很明显不是一个真正意义存在的图片,我们需要很复杂的推算以及各种炼丹模型生成的AI图片,我自己认为难度系数很高,我仅仅用了64个文字形容词就生成了她,很有初恋的感觉,符合审美观,对于计算机来说她是一组数字,可是这个数字是怎么推断出来的就是很复杂了,我们在模型训练中可以看到基本上到处都存在着Pandas处理,在最基础的OpenCV中也会有很多的Pandas处理,所以我OpenCV写到一般就开始写这个专栏了,因为我发现没有Pandas处理基本上想好好的操作图片数组真的是相当的麻烦,可以在很多AI大佬的文章中发现都有这个Pandas文章,每个人的写法都不同,但是都是适合自己理解的方案,我是用于教学的,故而我相信我的文章更适合新晋的程序员们学习,期望能节约大家的事件从而更好的将精力放到真正去实现某种功能上去。本专栏会更很多,只要我测试出新的用法就会添加,持续更新迭代,可以当做【Pandas字典】来使用,期待您的三连支持与帮助。


环境

系统环境:win11

Python版本:python3.9

编译工具:PyCharm Community Edition 2022.3.1

Numpy版本:1.19.5

Pandas版本:1.4.4


DataFrame删除NaN空值

在数据操作的时候我们经常会见到NaN空值的情况,很耽误我们的数据清理,那我们使用dropna函数删除DataFrame中的空值。

实际上能处理的有3个函数,我们用dropna来删除这帮空值。

DataFrame.dropna([axis, how, thresh, …])      #返回对象与给定的轴上的标签省略或者任何地方
DataFrame.fillna([value, method, axis, …])    #填充空值
DataFrame.replace([to_replace, value, …])     #值在“to_replace”替换为“value”。

dropna函数参数

axis:操作的轴向,X/Y

how:两个参数any与all,all代表整个行都是空才会删除

thresh:某行的空值超过这个阈值才会删除

subset:处理空值时,只考虑给定的列。需要提供列名数组

inplace:值是True和False,True是在原DataFrame上修改,False则创建新副本

测试数据

import pandas as pd
import numpy as np

df = pd.DataFrame(
    {'name': ['张丽华', '李诗诗', '王语嫣', '赵飞燕', '阮玲玉'],
     'sex': ['girl', 'woman', np.nan, 'girl', 'woman'],
     'age': [22, np.nan, 16, np.nan, 27]
     }
)

print(df)

可以看到有好多空值:

编辑

删除所有有空的行

axis属性值

这里的dropna只填写了【axis】一个参数,其中0的值代表行,1的值代表列。

编辑

import pandas as pd
import numpy as np

df = pd.DataFrame(
    {'name': ['张丽华', '李诗诗', '王语嫣', '赵飞燕', '阮玲玉'],
     'sex': ['girl', 'woman', np.nan, 'girl', 'woman'],
     'age': [22, np.nan, 16, np.nan, 27]
     }
)
print(df)
print("----axis=0----")
# 删除所有有空的行
df = df.dropna(axis=0)

print(df)

axis=0效果测试:

编辑

axis=1效果测试:

编辑

很明显我们能看的出来,只要是axis=0有空的行就删除了,axis=1有空的列就删除了。

how属性值

import pandas as pd
import numpy as np

df = pd.DataFrame(
    {'name': ['张丽华', '李诗诗', '王语嫣', '赵飞燕', '阮玲玉'],
     'sex': ['girl', 'woman', np.nan, 'girl', 'woman'],
     'age': [22, np.nan, 16, np.nan, 27]
     }
)
print(df)
print("----how='any'----")
# any有空行就删除·all必须都是空行才能删除
df = df.dropna(how='any')

print(df)

any效果:

编辑

all效果:由于没有都是NaN的行,故而都没有删除。

编辑

thres属性值

import pandas as pd
import numpy as np

df = pd.DataFrame(
    {'name': ['张丽华', '李诗诗', '王语嫣', '赵飞燕', '阮玲玉'],
     'sex': ['girl', 'woman', np.nan, 'girl', 'woman'],
     'age': [22, np.nan,  np.nan, np.nan, 27]
     }
)
print(df)
print("----thresh=2----")
# 有空的都删掉
df = df.dropna(thresh=2)

print(df)

有2个nan就会删除行

编辑

subset属性值

我这里清除的是[name,age]两列只要有NaN的值就会删除行

import pandas as pd
import numpy as np

df = pd.DataFrame(
    {'name': ['张丽华', '李诗诗', '王语嫣', '赵飞燕', '阮玲玉'],
     'sex': ['girl', 'woman', np.nan, 'girl', 'woman'],
     'age': [22, np.nan, 16, np.nan, 27]
     }
)
print(df)
print("----subset----")
# subset传的参数是列名的数组
df = df.dropna(subset=['name', 'age'])

print(df)

实际效果:

编辑

inplace是否复制副本

inplace=False,不复制副本,我们不二次赋值。

import pandas as pd
import numpy as np

df = pd.DataFrame(
    {'name': ['张丽华', '李诗诗', '王语嫣', '赵飞燕', '阮玲玉'],
     'sex': ['girl', 'woman', np.nan, 'girl', 'woman'],
     'age': [22, np.nan, 16, np.nan, 27]
     }
)
print(df)
print("----subset----")
# subset传的参数是列名的数组
df.dropna(subset=['name', 'age'], inplace=False)

print(df)

复制副本,但是未重新赋值效果

编辑

不复制副本

import pandas as pd
import numpy as np

df = pd.DataFrame(
    {'name': ['张丽华', '李诗诗', '王语嫣', '赵飞燕', '阮玲玉'],
     'sex': ['girl', 'woman', np.nan, 'girl', 'woman'],
     'age': [22, np.nan, 16, np.nan, 27]
     }
)
print(df)
print("----subset----")
# subset传的参数是列名的数组
df.dropna(subset=['name', 'age'], inplace=True)

print(df)

可以很直接的看到效果。 

编辑

fillna测试

pandas.DataFrame.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,字典中的项为,为类型向下转换规则。

示例代码:替换成10

import pandas as pd
import numpy as np

df = pd.DataFrame(
    {'name': ['张丽华', '李诗诗', '王语嫣', '赵飞燕', '阮玲玉'],
     'sex': ['girl', 'woman', np.nan, 'girl', 'woman'],
     'age': [22, np.nan, np.nan, np.nan, 27]
     }
)
print(df)
print("----fillna----")
# 有空的都删掉
df2 = df.fillna(10,
                method=None,
                axis=1,  # axis=0或"index":沿着行的向(纵向); axis=1或"column":是沿着列的方向(横向)
                limit=2,  # 在没指定method的情况下,沿着axis指定方向上填充的个数不大于limit设定值
                inplace=False)  # 返回新的DataFrame
print("用10替换后的df2 = \n", df2)

实际效果:


总结

我们很多的时候在处理SQL的时候需要去掉空值,其实和这个操作是一样的,空值是很多的时候没有太大意义,数据清洗的时候就会用到这块了。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。