熊猫:我如何找到col值,索引Nan值存在的位置?

时间:2017-08-03 01:37:34

标签: python pandas

In [3]: import numpy as np

In [4]: b = pd.DataFrame(np.array([
   ...:     [1,np.nan,3,4],
   ...:     [np.nan, 4, np.nan, 4]
   ...: ]))

In [13]: b
Out[13]:
     0    1    2    3
0  1.0  NaN  3.0  4.0
1  NaN  4.0  NaN  4.0

我想找到Nan值存在的列名和索引。

例如,“b在[{1}},NaNindex 0, col1处有index 0, col0值。

我尝试了什么:

1

index 1 col2

=>我不知道为什么它会显示In [14]: b[b.isnull()] Out[14]: 0 1 2 3 0 NaN NaN NaN NaN 1 NaN NaN NaN NaN 填充DataFrame

2

NaN

=>它仅显示In [15]: b[b[0].isnull()] Out[15]: 0 1 2 3 1 NaN 4.0 NaN 4.0 中存在DataFrame值的Nan的一部分。

我怎么能

1 个答案:

答案 0 :(得分:3)

您可以使用np.where查找pd.isnull(b)为True的索引:

import numpy as np
import pandas as pd

b = pd.DataFrame(np.array([
    [1,np.nan,3,4],
    [np.nan, 4, np.nan, 4]]))

idx, idy = np.where(pd.isnull(b))
result = np.column_stack([b.index[idx], b.columns[idy]])
print(result)
# [[0 1]
#  [1 0]
#  [1 2]]

或使用DataFrame.stack通过将列标签移动到索引中来重新整形DataFrame。 这会创建一个True,其中b为null:

mask = pd.isnull(b).stack()
# 0  0    False
#    1     True
#    2    False
#    3    False
# 1  0     True
#    1    False
#    2     True
#    3    False

然后从MultiIndex中读取行和列标签:

print(mask.loc[mask])
# 0  1    True
# 1  0    True
#    2    True
# dtype: bool

print(mask.loc[mask].index.tolist())
# [(0, 1), (1, 0), (1, 2)]