【发布时间】:2016-07-13 13:43:51
【问题描述】:
给定一个 pandas 数据框,其中包含分散在各处的可能 NaN 值:
问题:如何确定哪些列包含 NaN 值?特别是,我可以获得包含 NaN 的列名列表吗?
【问题讨论】:
-
df.isna().any()[lambda x: x]为我工作
标签: python pandas dataframe nan
给定一个 pandas 数据框,其中包含分散在各处的可能 NaN 值:
问题:如何确定哪些列包含 NaN 值?特别是,我可以获得包含 NaN 的列名列表吗?
【问题讨论】:
df.isna().any()[lambda x: x] 为我工作
标签: python pandas dataframe nan
更新:使用 Pandas 0.22.0
较新的 Pandas 版本具有新方法 'DataFrame.isna()' 和 'DataFrame.notna()'
In [71]: df
Out[71]:
a b c
0 NaN 7.0 0
1 0.0 NaN 4
2 2.0 NaN 4
3 1.0 7.0 0
4 1.0 3.0 9
5 7.0 4.0 9
6 2.0 6.0 9
7 9.0 6.0 4
8 3.0 0.0 9
9 9.0 0.0 1
In [72]: df.isna().any()
Out[72]:
a True
b True
c False
dtype: bool
作为列列表:
In [74]: df.columns[df.isna().any()].tolist()
Out[74]: ['a', 'b']
选择那些列(至少包含一个NaN 值):
In [73]: df.loc[:, df.isna().any()]
Out[73]:
a b
0 NaN 7.0
1 0.0 NaN
2 2.0 NaN
3 1.0 7.0
4 1.0 3.0
5 7.0 4.0
6 2.0 6.0
7 9.0 6.0
8 3.0 0.0
9 9.0 0.0
旧答案:
尝试使用isnull():
In [97]: df
Out[97]:
a b c
0 NaN 7.0 0
1 0.0 NaN 4
2 2.0 NaN 4
3 1.0 7.0 0
4 1.0 3.0 9
5 7.0 4.0 9
6 2.0 6.0 9
7 9.0 6.0 4
8 3.0 0.0 9
9 9.0 0.0 1
In [98]: pd.isnull(df).sum() > 0
Out[98]:
a True
b True
c False
dtype: bool
或者像@root 提出的更清晰的版本:
In [5]: df.isnull().any()
Out[5]:
a True
b True
c False
dtype: bool
In [7]: df.columns[df.isnull().any()].tolist()
Out[7]: ['a', 'b']
选择一个子集 - 所有列至少包含一个 NaN 值:
In [31]: df.loc[:, df.isnull().any()]
Out[31]:
a b
0 NaN 7.0
1 0.0 NaN
2 2.0 NaN
3 1.0 7.0
4 1.0 3.0
5 7.0 4.0
6 2.0 6.0
7 9.0 6.0
8 3.0 0.0
9 9.0 0.0
【讨论】:
df.columns[df.isin['xxx'].any()].tolist()
df.columns[df.eq(search_for_value).any()].tolist()
isna, notna 吗?
您可以使用df.isnull().sum()。它显示了所有列和每个特征的总 NaN。
【讨论】:
我遇到了一个问题,我必须在屏幕上对许多列进行目视检查,因此筛选并返回有问题的列的候选名单组合是
nan_cols = [i for i in df.columns if df[i].isnull().any()]
如果这对任何人都有帮助
如果您想过滤掉具有比阈值更多的 nan 值的列,例如 85% 然后使用
nan_cols85 = [i for i in df.columns if df[i].isnull().sum() > 0.85*len(data)]
【讨论】:
这对我有用,
1.用于获取至少具有 1 个空值的列。 (列名)
data.columns[data.isnull().any()]
2。用于获取具有计数的列,至少具有 1 个空值。
data[data.columns[data.isnull().any()]].isnull().sum()
[可选] 3。用于获取 null 计数的百分比。
data[data.columns[data.isnull().any()]].isnull().sum() * 100 / data.shape[0]
【讨论】:
在具有大量列的数据集中,最好查看有多少列包含空值以及有多少列不包含。
print("No. of columns containing null values")
print(len(df.columns[df.isna().any()]))
print("No. of columns not containing null values")
print(len(df.columns[df.notna().all()]))
print("Total no. of columns in the dataframe")
print(len(df.columns))
例如,在我的数据框中,它包含 82 列,其中 19 列至少包含一个空值。
此外,您还可以自动删除列和行,具体取决于哪个具有更多空值
这是智能执行此操作的代码:
df = df.drop(df.columns[df.isna().sum()>len(df.columns)],axis = 1)
df = df.dropna(axis = 0).reset_index(drop=True)
注意:上面的代码删除了所有的空值。如果您想要空值,请先处理它们。
【讨论】:
df.columns[df.isnull().any()].tolist()
它将返回包含空行的列的名称
【讨论】:
我用这三行代码打印出至少包含一个空值的列名:
for column in dataframe:
if dataframe[column].isnull().any():
print('{0} has {1} null values'.format(column, dataframe[column].isnull().sum()))
【讨论】:
这是其中一种方法..
import pandas as pd
df = pd.DataFrame({'a':[1,2,np.nan], 'b':[np.nan,1,np.nan],'c':[np.nan,2,np.nan], 'd':[np.nan,np.nan,np.nan]})
print(pd.isnull(df).sum())
【讨论】:
这两个都应该工作:
df.isnull().sum()
df.isna().sum()
DataFrame 方法 isna() 或 isnull() 完全相同。
注意:空字符串''被认为是False(不被认为是NA)
【讨论】:
我知道这是一个很好回答的问题,但我想稍微调整一下。这个答案只返回包含空值的列,并且仍然显示空值的计数。
pd.isnull(df).sum()[pd.isnull(df).sum() > 0]
null_count_ser = pd.isnull(df).sum()
is_null_ser = null_count_ser > 0
null_count_ser[is_null_ser]
name 5
phone 187
age 644
【讨论】:
df.isna() 为 NaN 返回 True 值,其余为 False。所以,做:
df.isna().any()
对于任何具有 NaN 的列将返回 True,对于其余列返回 False
【讨论】:
仅查看包含 NaN 的列和包含 NaN 的行:
isnulldf = df.isnull()
columns_containing_nulls = isnulldf.columns[isnulldf.any()]
rows_containing_nulls = df[isnulldf[columns_containing_nulls].any(axis='columns')].index
only_nulls_df = df[columns_containing_nulls].loc[rows_containing_nulls]
print(only_nulls_df)
【讨论】:
features_with_na=[如果 dataframe[features].isnull().sum()>0 的情况下,dataframe.columns 中的特征的特征]
对于 features_with_na 中的功能: print(feature, np.round(dataframe[feature].isnull().mean(), 4), '% 缺失值') 打印(features_with_na)
【讨论】:
如果您想查找包含 NaN 值的列并获取列名列表,则该代码有效。
na_names = df.isnull().any()
list(na_names.where(na_names == True).dropna().index)
如果要查找值为 all NaN 的列,可以将 any 替换为 all。
【讨论】: