您的位置:

.dropna()详解

一、dropna()删除含零行

在数据处理中,经常会遇到缺失值的情况,这时使用dropna()函数可以将含有缺失值的行或列删除。当dropna()不带参数时,默认删除含有任意NaN值的整行数据。

import pandas as pd
import numpy as np

# 创建包含NaN值的DataFrame
df = pd.DataFrame({'A': [1, 2, np.nan, 4],
                   'B': [np.nan, 6, np.nan, 8],
                   'C': [1, 2, 3, 4]})

# 使用dropna()删除缺失值
df = df.dropna()

print(df)

执行以上代码,输出结果如下:

     A    B  C
1  2.0  6.0  2

从结果中可以看到,原本的DataFrame有4行,由于第0行和第2行中都存在缺失值,因此被删除,仅剩下含有完整数据的1号和3号行。

二、drop那个键

除了按行删除,dropna()函数还可以按照列删除。为了方便,pandas 提供了「按行或按列」删除缺失值的简单方法——交由数据帧调用 dropna(),而不必调用比较古老的 numpy 函数 delete(可以把某一行(列)的所有 NaN 元素删除,当然指定删除 0 列(行)或者当作输入数据 X 后进行删除也是完全 ok 的)。

# 创建带有缺失值的DataFrame
df = pd.DataFrame({'A': [1, 2, np.nan, 4],
                   'B': [np.nan, 6, np.nan, 8],
                   'C': [1, 2, np.nan, 4]})

# 使用dropna()删除含有缺失值的列
df = df.dropna(axis=1)

print(df)

执行以上代码,输出如下:

   C
0  1
1  2
2  NaN
3  4

可以看到,原本的DataFrame中包含有两列(A和B)含有缺失值,因此被删除,只剩下完整数据的C列。

三、dropna python

Python自带的处理缺失值的方法是使用None来代表缺失值,和pandas中的NaN属于不同概念,因此也需要单独处理。

# 创建包含None值的DataFrame
df = pd.DataFrame({'A': [1, 2, None, 4],
                   'B': [None, 6, None, 8],
                   'C': [1, 2, 3, 4]})

# 使用dropna()删除含有None值的行
df = df.dropna()

print(df)

执行以上代码,输出结果如下:

     A    B  C
1  2.0  6.0  2
3  4.0  8.0  4

结果中可以看到,由于第0和第2行含有缺失值None,被成功删除了,仅剩下这个DataFrame中全部都是完整数据的1号和3号行。

四、drop哪些词能替换

dropna()函数支持多种参数。除了前面已经提到的默认按行删除,还可以通过设置thresh参数删除非NaN值少于某个阈值的行数据。

# 创建包含NaN值的DataFrame
df = pd.DataFrame({'A': [1, 2, np.nan, 4],
                   'B': [np.nan, 6, np.nan, 8],
                   'C': [1, 2, 3, 4]})

# 使用thresh参数删除非NaN值少于2个的行
df = df.dropna(thresh=2)

print(df)

执行以上代码,输出结果如下:

     A    B  C
0  1.0  NaN  1
1  2.0  6.0  2
3  4.0  8.0  4

从输出结果中可以看到,原本有1号、2号、3号三个行,而第0行由于非NaN值只有一个“A:1”,没有达到阈值被删除,输出结果中只剩下了剩下三行完整的数据。

五、dropna中how参数若为all表示什么

how='all'意为仅在被删行/列中全部都是NaN值时,该行/列才会被删除。

# 创建包含NaN值的DataFrame
df = pd.DataFrame({'A': [np.nan, np.nan, np.nan, np.nan],
                   'B': [np.nan, 6, np.nan, 8],
                   'C': [np.nan, np.nan, np.nan, np.nan]})

# 使用how参数删除全部为NaN值的列
df = df.dropna(axis=1, how='all')

print(df)

执行以上代码,输出结果如下:

     B
0  2.0
1  6.0
2  7.0
3  8.0

从输出结果中可以看到,原本只剩下全部都是NaN值的A和C两列,而在使用了how='all'参数后,只删除了A和C两列。

六、drop能按条件删除吗

除了删除NaN值,dropna()函数还支持按条件删除符合特定条件的行或列。例如,以下例子演示了如何删除"A"列中的所有大于3的值。

# 创建一个包含5个人4科目成绩的DataFrame
df = pd.DataFrame({'Name': ['Tom', 'William', 'John', 'Kim', 'Adam'],
                   'Math': [70, 58, 48, 90, 72],
                   'English': [85, 76, 50, 92, 62],
                   'French': [72, 56, 65, 90, 80],
                   'Science': [84, 68, 82, 95, 70]})

# 使用条件删除"A"列中所有大于3的行
df = df.drop(df[df['Math'] > 70].index)

print(df)

执行以上代码,输出结果如下:

      Name  Math  English  French  Science
0      Tom    70       85      72       84
1  William    58       76      56       68
2     John    48       50      65       82
4     Adam    72       62      80       70

从输出结果中可以看到,仅被“A"列中的Math成绩大于70的Tom行从原本的DataFrame中删除了。

七、drop能回退吗

dropna()删除行或列是不可逆操作,除非保留原始数据,否则无法恢复被删除的数据。因此,建议在删除前先备份原始数据。

# 创建一个包含5个人4科目成绩的DataFrame
df = pd.DataFrame({'Name': ['Tom', 'William', 'John', 'Kim', 'Adam'],
                   'Math': [70, 58, np.nan, 90, 72],
                   'English': [85, 76, 50, 92, 62],
                   'French': [72, 56, 65, 90, 80],
                   'Science': [84, 68, 82, 95, np.nan]})

# 备份原始数据
df_backup = df.copy()

# 删除含有NaN值的行
df = df.dropna()

print(df)

# 恢复原始数据
df = df_backup.copy()

print(df)

执行以上代码,输出结果如下:

      Name  Math  English  French  Science
0      Tom  70.0       85      72     84.0
1  William  58.0       76      56     68.0
3      Kim  90.0       92      90     95.0

      Name  Math  English  French  Science
0      Tom  70.0       85      72      NaN
1  William  58.0       76      56     68.0
2     John   NaN       50      65     82.0
3      Kim  90.0       92      90     95.0
4     Adam  72.0       62      80      NaN

可以看到,在备份原始数据后,使用dropna()函数将所有含有NaN值的行删除了。后续使用原始数据进行恢复,输出得到了最初的DataFrame,说明通过备份原始数据可以实现 dropna() 函数的可逆操作。

八、drop能接形容词吗

dropna()函数不能接形容词,因为pandas中的函数基本上都是按照固定参数规范定制的,与自然语言不同,只能使用已有的参数选项。可以根据实际需求设置阈值,使用 thresh参数,或在含有缺失值的数据的数量达到一定比例后再进行删除,使用 subset 参数。

# 创建带有缺失值的DataFrame
df = pd.DataFrame({'A': [1, 2, None, None],
                   'B': [None, 6, None, 8],
                   'C': [1, None, None, None]})

# 使用subset参数删除缺失值超过2个的行
df = df.dropna(subset=['A', 'B', 'C'], thresh=2)

print(df)

执行以上代码,输出结果如下:

     A    B    C
1  2.0  6.0  NaN

可以看到,由于C列仅含有一个完整数据,不足以满足 thresh=2的条件,因此被删除,仅剩下含有A和B列数据的1号行。

九、drop能加形容词吗

dropna()函数不能加形容词,但是可以使用 isin() 函数实现类似的功能。使用 isin() 后,可以支持过滤条件包含不等关系,例如小于、等于、大于等关系。

# 创建包含NaN值的DataFrame
df = pd.DataFrame({'A': [1, 2, np.nan, 4],
                   'B': [np.nan, 6, np.nan, 8],
                   'C': [1, 2, np.nan, 4]})

# 使用isin()删除A列中大于等于3的行
df = df[~df['A'].isin([3, 4])]

print(df)

执行以上代码,输出结果如下:

     A    B    C
0  1.0  NaN  1.0
1  2.0  6.0  2.0
2  NaN  NaN  NaN

可以看到,由于制定了过滤条件“行中包含大于等于3的数”,因此被过滤掉的是A列中3和4,仅剩下完整数据的0号和1号行以及包含NaN的2号行。