2015-11-16 60 views

Trả lời

18

Bạn có thể sử dụng 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 

Cũng có thể nghịch mask bởi ~:

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ó cách nào để làm điều đó mà không cần phải cắt các dataframe hai lần? Bởi vì theo cách này, chúng ta sẽ phải cuộn qua chỉ mục để tạo df1 và một lần khác cho cùng một điều kiện cho df2. Nhưng tôi không thể tìm ra cách để có được cả hai dataframes trong một dòng .. – ysearka

+1

Thật không may tôi nghĩ rằng chỉ có giải pháp này - xem [cookbook] (http://pandas.pydata.org/pandas-docs/stable/cookbook .html # splitting). – jezrael

2

Sử dụng groupby bạn có thể chia thành hai dataframes như

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 
Các vấn đề liên quan