2016-06-14 6 views
1

Ich habe mehrere hypothetische Tests an Insekten durchgeführt. Ich möchte Zeilen mit niedrigen result_1 Werten von 'weniger als 10' fallen lassen, die ich für nicht signifikant halte, aber gerne einen NaN Wert einreihig hinterlassen würde, um zu zeigen, welcher Test durchgeführt wurde und auf welchem ​​Insekt.Insert column specific NaN und drop rows je nach Wert

from pandas import Series, DataFrame 
import numpy as np 

A = Series(['A','A','B','B','B','C']) 
B = Series(['ant','flea','flea','spider','spider','flea']) 
C = Series([88,77,1,3,2,67]) 
D = Series(np.random.randn(6)) 

df = DataFrame({'test':A.values,'insect':B.values, 
      'result_1':C.values,'result_2':D.values}, 
      columns=['test','insect','result_1','result_2']) 
df 

So sieht das ursprüngliche Datenrahmen wie folgt aus:

enter image description here

Und weil Indizes 2,3 und 4 results_1 Werte < 10 haben, würde Ich mag alle diese Zeilen mit der Drop Vorbehalt, dass eine Zeile übrig ist (mit NaN in beide Ergebnisspalten) zu zeigen, dass Test B auf dem Floh (Index2) durchgeführt wurde, und eine Zeile sollte zeigen, dass tatsächlich Test B auf einer Spinne (von Indizes durchgeführt wurde 3 und 4, o ne muss gelöscht werden und der andere benötigt ein NaN in die Ergebnisspalten).

also die resultierende Datenrahmen sollte wie folgt aussehen:

enter image description here

Antwort

2

Ich glaube, Sie verwenden können:

#add NaN by condition 
df.loc[df.result_1 < 10, ['result_1','result_2']] = np.nan 
#drop duplicated by column insect 
df[df.result_1.isnull()] = df[df.result_1.isnull()].drop_duplicates(subset='insect') 
df = df.dropna(how='all') 
print (df) 
    test insect result_1 result_2 
0 A  ant  88.0 -0.037844 
1 A flea  77.0 -1.088879 
2 B flea  NaN  NaN 
3 B spider  NaN  NaN 
5 C flea  67.0 1.455632 

Eine andere Lösung mit den entsprechenden Index zu finden, und dann drop Reihe mit diesem index:

mask = df.result_1 < 10 

df.loc[mask, ['result_1','result_2']] = np.nan 
a = df[mask].duplicated(subset='insect') 
print (a) 
2 False 
3 False 
4  True 
dtype: bool 

a = a[a].index 
df = df.drop(a) 
print (df) 
    test insect result_1 result_2 
0 A  ant  88.0 -0.176274 
1 A flea  77.0 -0.123691 
2 B flea  NaN  NaN 
3 B spider  NaN  NaN 
5 C flea  67.0 -0.310655 
+0

Schön! Es funktioniert gut @jezrael – thescoop