【发布时间】:2017-08-12 19:24:23
【问题描述】:
我在熊猫中有以下df。
0 A B C
1 2 NaN 8
如何检查 df.iloc[1]['B'] 是否为 NaN?
我尝试使用df.isnan(),得到一张这样的表格:
0 A B C
1 false true false
但我不确定如何为表编制索引,以及这是否是执行工作的有效方式?
【问题讨论】:
我在熊猫中有以下df。
0 A B C
1 2 NaN 8
如何检查 df.iloc[1]['B'] 是否为 NaN?
我尝试使用df.isnan(),得到一张这样的表格:
0 A B C
1 false true false
但我不确定如何为表编制索引,以及这是否是执行工作的有效方式?
【问题讨论】:
如果您在特定列中查找 NaN 的索引,您可以使用
list(df['B'].index[df['B'].apply(np.isnan)])
如果您要获取数据框中所有可能的 NaN 值的索引,您可以执行以下操作
row_col_indexes = list(map(list, np.where(np.isnan(np.array(df)))))
indexes = []
for i in zip(row_col_indexes[0], row_col_indexes[1]):
indexes.append(list(i))
如果您正在寻找可以使用的单衬里:
list(zip(*[x for x in list(map(list, np.where(np.isnan(np.array(df)))))]))
【讨论】:
jezrael 的反应很到位。如果您只关心 NaN 值,我正在探索是否有更快的选择,因为根据我的经验,对平面数组求和(奇怪地)比计数更快。这段代码似乎更快:
df.isnull().values.any()
例如:
In [2]: df = pd.DataFrame(np.random.randn(1000,1000))
In [3]: df[df > 0.9] = pd.np.nan
In [4]: %timeit df.isnull().any().any()
100 loops, best of 3: 14.7 ms per loop
In [5]: %timeit df.isnull().values.sum()
100 loops, best of 3: 2.15 ms per loop
In [6]: %timeit df.isnull().sum().sum()
100 loops, best of 3: 18 ms per loop
In [7]: %timeit df.isnull().values.any()
1000 loops, best of 3: 948 µs per loop
【讨论】:
【讨论】:
df.isnull(df['B'].iloc[0])而不是pd.isnull(df['B'].iloc[0])。谢谢你这解决了我的问题!