我有一个像这样的pandas DataFrame:
a b
2011-01-01 00:00:00 1.883381 -0.416629
2011-01-01 01:00:00 0.149948 -1.782170
2011-01-01 02:00:00 -0.407604 0.314168
2011-01-01 03:00:00 1.452354 NaN
2011-01-01 04:00:00 -1.224869 -0.947457
2011-01-01 05:00:00 0.498326 0.070416
2011-01-01 06:00:00 0.401665 NaN
2011-01-01 07:00:00 -0.019766 0.533641
2011-01-01 08:00:00 -1.101303 -1.408561
2011-01-01 09:00:00 1.671795 -0.764629
是否有一种有效的方法来查找具有NaN的行的“整数”索引?在这种情况下,所需的输出应为[3, 6]
。
答案 0 :(得分:123)
这是一个更简单的解决方案:
inds = pd.isnull(df).any(1).nonzero()[0]
In [9]: df
Out[9]:
0 1
0 0.450319 0.062595
1 -0.673058 0.156073
2 -0.871179 -0.118575
3 0.594188 NaN
4 -1.017903 -0.484744
5 0.860375 0.239265
6 -0.640070 NaN
7 -0.535802 1.632932
8 0.876523 -0.153634
9 -0.686914 0.131185
In [10]: pd.isnull(df).any(1).nonzero()[0]
Out[10]: array([3, 6])
答案 1 :(得分:33)
对于DataFrame df
:
import numpy as np
index = df['b'].index[df['b'].apply(np.isnan)]
会返回MultiIndex
,您可以将其用于索引回df
,例如:
df['a'].ix[index[0]]
>>> 1.452354
对于整数索引:
df_index = df.index.values.tolist()
[df_index.index(i) for i in index]
>>> [3, 6]
答案 2 :(得分:6)
以防万一,如果你想找到' nan'的坐标。对于所有列而言(假设它们都是数字),请转到:
SELECT screening_start_hh24 INTO v_screening_start_hh24
FROM Screening
WHERE screening_id = :NEW.screening_id;
答案 3 :(得分:5)
不知道这是否为时已晚,但是您可以使用np.where来查找非值的索引,如下所示:
indices = list(np.where(df['b'].isna()[0]))
答案 4 :(得分:3)
一线解决方案。但是,它仅适用于一列。
df.loc[pandas.isna(df["b"]), :].index
答案 5 :(得分:1)
这是另一个更简单的看法:
df = pd.DataFrame([[0,1,3,4,np.nan,2],[3,5,6,np.nan,3,3]])
inds = np.asarray(df.isnull()).nonzero()
(array([0, 1], dtype=int64), array([4, 3], dtype=int64))
答案 6 :(得分:1)
我正在寻找具有NaN值的行的所有索引。
我的工作解决方案:
def get_nan_indexes(data_frame):
indexes = []
print(data_frame)
for column in data_frame:
index = data_frame[column].index[data_frame[column].apply(np.isnan)]
if len(index):
indexes.append(index[0])
df_index = data_frame.index.values.tolist()
return [df_index.index(i) for i in set(indexes)]
答案 7 :(得分:1)
以下是几种方法的测试:
%timeit np.where(np.isnan(df['b']))[0]
%timeit pd.isnull(df['b']).nonzero()[0]
%timeit np.where(df['b'].isna())[0]
%timeit df.loc[pd.isna(df['b']), :].index
及其相应的时间安排:
333 µs ± 9.95 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
280 µs ± 220 ns per loop (mean ± std. dev. of 7 runs, 1000 loops each)
313 µs ± 128 ns per loop (mean ± std. dev. of 7 runs, 1000 loops each)
6.84 ms ± 1.59 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
看来pd.isnull(df['DRGWeight']).nonzero()[0]
在计时方面胜出,但是前三种方法中的任何一种都具有可比的性能。
答案 8 :(得分:1)
这将为您提供每一列中 nan 的索引值:
df.loc[pd.isna(df).any(1), :].index
答案 9 :(得分:0)
如果您有日期时间索引,并且想要具有以下值:
df.loc[pd.isnull(df).any(1), :].index.values
答案 10 :(得分:0)
让数据框命名为 df ,并且感兴趣的列(即我们要在其中查找空值的列)是< strong> 'b' 。然后,以下代码段在数据框中给出了所需的null索引:
SELECT DISTINCT `clients_agreements`.`date_start`
, `buildings`.`id`
, `buildings`.`street`
, `buildings`.`street_nr`
, `clients`.`building_id`
, `clients_agreements`.`user_id`
FROM `clients_agreements`
LEFT JOIN `buildings` On `clients_agreements`.`user_id` = `buildings`.`id`
LEFT JOIN `clients` ON `clients`.`building_id` = `buildings`.`id`
WHERE `date_start` = (CURRENT_DATE)
答案 11 :(得分:0)
另一个简单的解决方案是list(np.where(df['b'].isnull())[0])