2013-07-01 21 views
8

Tôi có kinh nghiệm về R và mới đối với Python Pandas. Tôi đang cố gắng để chỉ mục một DataFrame để lấy các hàng đáp ứng một tập hợp các điều kiện logic - giống như câu lệnh "where" của SQL.lập chỉ mục một khung dữ liệu Python Pandas với nhiều điều kiện SQL giống như câu lệnh

Tôi biết cách thực hiện điều này trong R bằng dataframes (và với gói data.table của R, giống như một khung dữ liệu Pandas hơn khung dữ liệu gốc của R).

Dưới đây là một số mã mẫu xây dựng một DataFrame và mô tả về cách tôi muốn lập chỉ mục nó. Có cách nào làm dễ hơn không?

import pandas as pd 
import numpy as np 

# generate some data 
mult = 10000 
fruits = ['Apple', 'Banana', 'Kiwi', 'Grape', 'Orange', 'Strawberry']*mult 
vegetables = ['Asparagus', 'Broccoli', 'Carrot', 'Lettuce', 'Rutabaga', 'Spinach']*mult 
animals = ['Dog', 'Cat', 'Bird', 'Fish', 'Lion', 'Mouse']*mult 
xValues = np.random.normal(loc=80, scale=2, size=6*mult) 
yValues = np.random.normal(loc=79, scale=2, size=6*mult) 

data = {'Fruit': fruits, 
     'Vegetable': vegetables, 
     'Animal': animals, 
     'xValue': xValues, 
     'yValue': yValues,} 

df = pd.DataFrame(data) 

# shuffle the columns to break structure of repeating fruits, vegetables, animals 
np.random.shuffle(df.Fruit) 
np.random.shuffle(df.Vegetable) 
np.random.shuffle(df.Animal) 

df.head(30) 

# filter sets 
fruitsInclude = ['Apple', 'Banana', 'Grape'] 
vegetablesExclude = ['Asparagus', 'Broccoli'] 

# subset1: All rows and columns where: 
# (fruit in fruitsInclude) AND (Vegetable not in vegetablesExlude) 

# subset2: All rows and columns where: 
# (fruit in fruitsInclude) AND [(Vegetable not in vegetablesExlude) OR (Animal == 'Dog')] 

# subset3: All rows and specific columns where above logical conditions are true. 

Tất cả trợ giúp và đầu vào đều được hoan nghênh và đánh giá cao!

Cảm ơn, Randall

+0

Wow. Chính xác những gì tôi cần. Cảm ơn bạn đã trả lời nhanh và trực tiếp. Lưu ý rằng tôi đánh vần rauTrong số đó sai ... nên đã có rauExclude (với c). Sửa chữa nó trong đoạn mã trên nên được sao chép và dán để kiểm tra. Cảm ơn một lần nữa. Randall. – user2537610

Trả lời

14
# subset1: All rows and columns where: 
# (fruit in fruitsInclude) AND (Vegetable not in vegetablesExlude) 
df.ix[df['Fruit'].isin(fruitsInclude) & ~df['Vegetable'].isin(vegetablesExclude)] 

# subset2: All rows and columns where: 
# (fruit in fruitsInclude) AND [(Vegetable not in vegetablesExlude) OR (Animal == 'Dog')] 
df.ix[df['Fruit'].isin(fruitsInclude) & (~df['Vegetable'].isin(vegetablesExclude) | (df['Animal']=='Dog'))] 

# subset3: All rows and specific columns where above logical conditions are true. 
df.ix[df['Fruit'].isin(fruitsInclude) & ~df['Vegetable'].isin(vegetablesExclude) & (df['Animal']=='Dog')] 
+0

Hãy đánh bại tôi thật kỹ! Đó là giải pháp chính xác mà tôi đã đưa ra +1 – spencerlyon2

+0

Nếu tất cả những gì tôi muốn là các chỉ mục, có cách ngắn hơn: 'df.ix [df ['Fruit'] .inin (fruitsInclude) .index' – Rhubarb

+0

@ Zhubarb: 'df.index [df ['Trái cây'] .inin (fruitsInclude)]' ngắn hơn và (trên máy của tôi ~ 33%) nhanh hơn 'df.ix [df ['Fruit'] .inin (fruitsInclude)] .index'. – unutbu

Các vấn đề liên quan