给定一个pandas数据框架,其中包含可能分散在这里和那里的NaN值:
问题:我如何确定哪些列包含NaN值?特别是,我能得到包含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值):
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.isnull().sum()。它显示了每个特征的所有列和总nan。
df.isnull().sum()
我使用这三行代码打印出包含至少一个空值的列名:
for column in dataframe: if dataframe[column].isnull().any(): print('{0} has {1} null values'.format(column, dataframe[column].isnull().sum()))
这两种方法都有效:
df.isnull().sum() df.isna().sum()
DataFrame方法isna()或isnull()完全相同。
isna()
isnull()
请注意:空字符串''被认为是False(不被认为是NA)
''
我有一个问题,我必须有许多列在屏幕上进行视觉检查,所以一个筛选并返回违规列的短列表比较
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)]
在有大量列的数据集中,最好能看到有多少列包含空值,有多少列不包含空值。
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)
注意:上面的代码删除你所有的空值。如果需要空值,请在此之前处理它们。
这对我很有效,
1. 用于获取至少有一个空值的列。(列名称)
data.columns[data.isnull().any()]
2. 用于获取具有count的列,且至少有1个空值。
data[data.columns[data.isnull().any()]].isnull().sum()
< >强(可选) 3.
data[data.columns[data.isnull().any()]].isnull().sum() * 100 / data.shape[0]
df.isna()返回NaN的真正的值,其余的假值。所以,做:
df.isna()
df.isna().any()
将返回True为任何列有NaN, 假为其余
df.columns[df.isnull().any()].tolist()
它将返回包含空行的列的名称
这是其中一种方法。
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())
enter image description here
要查看包含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 =[feature用于数据帧中的特征。如果dataframe[features].isnull().sum()>0]
for features_with_na: Print (feature, np.round(dataframe[feature].isnull().mean(), 4), '%缺失值') 打印(features_with_na) < / p >
我知道这是一个很好的回答问题,但我想做一个小小的调整。这个答案只返回包含空值的列,并且仍然显示空值的计数。
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
如果您希望查找包含NaN值的列并获得列名列表,则该代码可以工作。
na_names = df.isnull().any() list(na_names.where(na_names == True).dropna().index)
如果你想找到值为所有 nan的列,你可以用all替换any。
all
any