pandas - 删除包含nans的行 - 忽略列

时间:2018-06-10 18:41:48

标签: python pandas

我希望能够从数据框(orig)中删除与衍生数据框(filtered)中包含NaN值的行对应的行。问题是派生数据框有一个删除的列,导致每个行被删除。要修改它,我必须重新插入已删除的列。是否有更优雅的方法来实现所需的结果,而不是重新插入从filtered中删除的列?

>>> orig = pd.DataFrame([
                         [1, 1.0, 'one'], 
                         [2, 2.0, 'two'],
                         [100, 100.0, 'one-hundred']
                        ], columns=['Integers', 'Floats', 'Strings'])
>>> numeric = orig.select_dtypes(include=['int', 'float'])
>>> numeric
   Integers  Floats
0         1     1.0
1         2     2.0
2       100     100.0
>>> filtered = numeric[np.abs(numeric - numeric.mean())<=(numeric.std())].dropna()
>>> filtered
   Integers  Floats
0       1.0     1.0
1       2.0     2.0

下一行将返回一个空数据框,因为filtered中没有列Strings,因此排除了orig中的每一行。

>>> removed_rows = orig[orig.isin(filtered)].dropna()

在运行上面的代码行之前,我必须重新插入第二行中删除的非数字列:

>>> filtered['Strings'] = orig['Strings']

最终获得理想的结果:

>>> removed_rows
   Integers  Floats Strings
0       1.0     1.0     one
1       2.0     2.0     two

如果这是唯一的方法,那就没关系 - 但我希望有一个更优雅的方式来做到这一点。有吗?

3 个答案:

答案 0 :(得分:3)

使用DataFrame.all检查每行True

orig[(np.abs(numeric - numeric.mean()) <= (numeric.std())).all(axis=1)] 

在pandas 0.23.0出于某种原因,numeric仅返回列float

print (orig.dtypes)
Integers      int64
Floats      float64
Strings      object
dtype: object

print (orig.select_dtypes(include=['int', 'float']))
   Floats
0     1.0
1     2.0
2   100.0

使用np.number更好:

print (orig.select_dtypes(include=np.number))
   Integers  Floats
0         1     1.0
1         2     2.0
2       100   100.0

答案 1 :(得分:2)

索引到orig[(np.abs(numeric - numeric.mean()) <= (numeric.std())).all(axis=1)]

orig[(np.abs(numeric - numeric.mean()) <= (numeric.std())).min(axis=1)]

或者,

   Integers  Floats Strings
0         1     1.0     one
1         2     2.0     two

colum_1   colum_2   colum_3   Y
  0.5        1         2      1
  0.5        1.1       2      1
  0.55       0.95      3      1
  0.1        1         2      2
  2          0.9       3      3

答案 2 :(得分:0)

为什么不

orig[orig.isin(filtered).max(1).astype(bool)]
    Integers    Floats  Strings
0   1           1.0     one
1   2           2.0     two

orig[orig.isin(filtered).sum(1).astype(bool)]

    Integers    Floats  Strings
0   1           1.0     one
1   2           2.0     two