2015-11-16 33 views

Antwort

18

können Sie boolean indexing verwenden:

df = pd.DataFrame({'Sales':[10,20,30,40,50], 'A':[3,4,7,6,1]}) 
print (df) 
    A Sales 
0 3  10 
1 4  20 
2 7  30 
3 6  40 
4 1  50 

s = 30 

df1 = df[df['Sales'] >= s] 
print (df1) 
    A Sales 
2 7  30 
3 6  40 
4 1  50 

df2 = df[df['Sales'] < s] 
print (df2) 
    A Sales 
0 3  10 
1 4  20 

Auch ist möglich, Invertzucker mask von ~:

mask = df['Sales'] >= s 
df1 = df[mask] 
df2 = df[~mask] 
print (df1) 
    A Sales 
2 7  30 
3 6  40 
4 1  50 

print (df2) 
    A Sales 
0 3  10 
1 4  20 

print (mask) 
0 False 
1 False 
2  True 
3  True 
4  True 
Name: Sales, dtype: bool 

print (~mask) 
0  True 
1  True 
2 False 
3 False 
4 False 
Name: Sales, dtype: bool 
+1

Gibt es eine Möglichkeit, es zu tun, ohne dass den Datenrahmen zweimal schneiden zu müssen? Denn auf diese Weise müssen wir den Index überspielen, um df1 zu erstellen, und ein weiteres Mal genau die gleiche Bedingung für df2. Aber ich kann nicht herausfinden, wie man beide Datenfelder in einer einzigen Zeile bekommt. – ysearka

+1

Leider denke ich, dass es nur diese Lösung gibt - siehe [Kochbuch] (http://pandas.pydata.org/pandas-docs/stable/cookbook .html # spalten). – jezrael

2

Mit groupby Sie in zwei Datenrahmen aufgeteilt könnten wie

In [1047]: df1, df2 = [x for _, x in df.groupby(df['Sales'] < 30)] 

In [1048]: df1 
Out[1048]: 
    A Sales 
2 7  30 
3 6  40 
4 1  50 

In [1049]: df2 
Out[1049]: 
    A Sales 
0 3  10 
1 4  20 
Verwandte Themen