2015-11-16 26 views

risposta

18

È possibile utilizzare boolean indexing:

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 

è anche possibile invertire mask da ~:

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

C'è un modo per farlo senza dover tagliare il dataframe due volte? Perché in questo modo dovremo passare all'indice index per creare df1, e un'altra volta per la stessa identica condizione per df2. Ma non riesco a capire come ottenere entrambi i dataframes in una singola riga .. – ysearka

+1

Purtroppo penso che ci sia solo questa soluzione - vedi [ricettario] (http://pandas.pydata.org/pandas-docs/stable/cookbook .html # splitting). – jezrael

2

utilizza groupby si potrebbe dividere in due dataframes come

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 
Problemi correlati