一、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号行。