如何删除Pandas DataFrame中某一列值为NaN的行
这是一个被反复提问的老问题,但我相信仍有一些更有用的信息可以在这个帖子上浮出水面。如果你正在寻找以下任一问题的答案,请继续阅读:
- 是否可以删除具有NaN值的任何值的行?如果全部都是NaN呢?
- 是否可以在删除行时只查看特定列中的NaN值?
- 是否可以删除具有指定数量NaN值的行?
- 如何删除列而不是行?
- 我尝试了上述所有选项,但我的DataFrame仍然无法更新!
已经说过df.dropna
是从DataFrame删除NaN的规范方法,但没有什么比一些视觉线索更能帮助你了解。
# Setup
df = pd.DataFrame({
'A': [np.nan, 2, 3, 4],
'B': [np.nan, np.nan, 2, 3],
'C': [np.nan]*3 + [3]})
df
A B C
0 NaN NaN NaN
1 2.0 NaN NaN
2 3.0 2.0 NaN
3 4.0 3.0 3.0
以下是最重要的参数细节及其工作原理,以FAQ格式排列。
如果任何值为NaN,我可以删除行吗? 如果全部为NaN呢?
这就是how=...
参数派上用场的地方。它可以是以下之一:
'any'
(默认)-如果至少有一列具有NaN,则删除行
'all'
- 仅在所有列都有NaN时才删除行
<!_ ->
# Removes all but the last row since there are no NaNs
df.dropna()
A B C
3 4.0 3.0 3.0
# Removes the first row only
df.dropna(how='all')
A B C
1 2.0 NaN NaN
2 3.0 2.0 NaN
3 4.0 3.0 3.0
注意
如果您只想查看哪些行为空(也就是说,如果您想要一系列布尔掩码的行),请使用
isna
函数:
df.isna()
A B C
0 True True True
1 False True True
2 False False True
3 False False False
df.isna().any(axis=1)
0 True
1 True
2 True
3 False
dtype: bool
要获取此结果的反转,请使用
notna
。这是在删除行时仅查看特定列中的NaN值的用例,您可以使用
subset=[...]
参数指定要查看的列(或具有
axis = 1
的索引,以便在删除行或列时只查看这些列(或行)。)。
# Drop all rows with NaNs in A
df.dropna(subset=['A'])
A B C
1 2.0 NaN NaN
2 3.0 2.0 NaN
3 4.0 3.0 3.0
# Drop all rows with NaNs in A OR B
df.dropna(subset=['A', 'B'])
A B C
2 3.0 2.0 NaN
3 4.0 3.0 3.0
我可以删除特定数量的NaN值吗?
这是使用thresh = ...
参数的情况。将最小数量的非空值指定为整数。
df.dropna(thresh=1)
A B C
1 2.0 NaN NaN
2 3.0 2.0 NaN
3 4.0 3.0 3.0
df.dropna(thresh=2)
A B C
2 3.0 2.0 NaN
3 4.0 3.0 3.0
df.dropna(thresh=3)
A B C
3 4.0 3.0 3.0
需要注意的是,你需要指定要保留多少个非空值,而不是要删除多少个空值。这对新用户来说是一个痛点。
幸运的是,修复很容易:如果你有一个空值计数,只需从列大小中减去它,就可以得到该函数的正确阈值参数。
required_min_null_values_to_drop = 2
df.dropna(thresh=df.shape[1] - required_min_null_values_to_drop + 1)
A B C
2 3.0 2.0 NaN
3 4.0 3.0 3.0
如何删除列而不是行?
使用axis=...
参数,它可以是axis=0
或axis=1
。
告诉函数您想要删除的是行(axis=0
)还是列(axis=1
)。
df.dropna()
A B C
3 4.0 3.0 3.0
# All columns have rows, so the result is empty.
df.dropna(axis=1)
Empty DataFrame
Columns: []
Index: [0, 1, 2, 3]
# Here's a different example requiring the column to have all NaN rows
# to be dropped. In this case no columns satisfy the condition.
df.dropna(axis=1, how='all')
A B C
0 NaN NaN NaN
1 2.0 NaN NaN
2 3.0 2.0 NaN
3 4.0 3.0 3.0
# Here's a different example requiring a column to have at least 2 NON-NULL
# values. Column C has less than 2 NON-NULL values, so it should be dropped.
df.dropna(axis=1, thresh=2)
A B
0 NaN NaN
1 2.0 NaN
2 3.0 2.0
3 4.0 3.0
我尝试了上面所有的选项,但我的DataFrame就是不更新!
dropna
,和pandas API中的大多数其他函数一样,返回的是一个新的DataFrame(原始数据的副本,带有更改后的结果),因此如果您想看到更改,应将其重新赋值。
df.dropna(...) # wrong
df.dropna(..., inplace=True) # right, but not recommended
df = df.dropna(...) # right
参考资料
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.dropna.html
DataFrame.dropna(
self, axis=0, how='any', thresh=None, subset=None, inplace=False)
df.dropna(subset = ['column1_name', 'column2_name', 'column3_name'])
- Sergey Orshanskiydf.dropna(subset = ['EPS'])
- Ka Wa Yipdf = df.dropna(subset=df.columns.values)
,这会删除所有包含NaN的行。如果没有任何NaN存在,则不会进行任何更改。 - dejjub-AIS