如何删除某一列中值为 NaN 的 Pandas DataFrame 行
这是一个老问题,已经被打死了,但我相信在这个线程上有一些更有用的信息可以浮出水面。如果您正在寻找以下任何问题的答案,请继续阅读:
- 如果行的任何值具有 NaN,我可以删除行吗?如果它们都是 NaN 怎么办?
- 删除行时,我只能查看特定列中的 NaN 吗?
- 我可以删除具有特定 NaN 值计数的行吗?
- 如何删除列而不是行?
- 我尝试了上述所有选项,但我的 DataFrame 不会更新!
已经有人说这df.dropna
是从 DataFrames 中删除 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
以下是最重要的论点及其工作原理的详细信息,以常见问题解答格式排列。
如果行的任何值具有 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
注意
如果您只想查看哪些行为空(IOW,如果您想要行的布尔掩码),请使用
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
)告诉 pandasaxis=1
在删除行(或带有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=...
参数的一个用例。将 NON-NULL 值的最小数量指定为整数。
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
这里要注意的是,您需要指定要保留多少个 NON-NULL 值,而不是要删除多少个 NULL 值。这是新用户的痛点。
幸运的是,修复很简单:如果您有 NULL 值的计数,只需从列大小中减去它即可获得函数的正确 thresh 参数。
required_min_null_values_to_drop = 2 # drop rows with at least 2 NaN
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
or 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)