我希望能够从数据框(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
如果这是唯一的方法,那就没关系 - 但我希望有一个更优雅的方式来做到这一点。有吗?
答案 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