2015-02-10 18 views
6

Xem xét một đa-index dataframe df:Pandas eval với dataframes đa-index

A  bar    flux   
B  one  three  six  three 
x 0.627915 0.507184 0.690787 1.166318 
y 0.927342 0.788232 1.776677 -0.512259 
z 1.000000 1.000000 1.000000 0.000000 

Tôi muốn sử dụng eval để trừ ('bar', 'one') từ ('flux', six'). Cú pháp eval có hỗ trợ loại chỉ mục này không?

+2

Tôi nghĩ có hỗ trợ cho chỉ số MI nhưng không cột MI, xem https://github.com/pydata/pandas/pull/4164#issuecomment-24009601. Một workaround/hack là để thiết lập các cột, làm các truy vấn, thiết lập lại các cột (vì đây thường là một hoạt động giá rẻ). –

Trả lời

1

Bạn có thể làm điều này mà không sử dụng eval bằng cách sử dụng các ký hiệu tiêu chuẩn Python tương đương:

df['bar']['one'] - df['flux']['six']` 

Hãy xem this tham khảo. Dưới đây là một ví dụ cho bạn, dựa trên các đối tượng trong câu hỏi của bạn:

from pandas import DataFrame, MultiIndex 

# Create the object 
columns = [ 
    ('bar', 'one'), 
    ('bar', 'three'), 
    ('flux', 'six'), 
    ('flux', 'three') 
] 
data = [ 
    [0.627915, 0.507184, 0.690787, 1.166318], 
    [0.927342, 0.788232, 1.776677, -0.512259], 
    [1.000000, 1.000000, 1.000000, 0.000000] 
] 
index = MultiIndex.from_tuples(columns, names=['A', 'B']) 
df  = DataFrame(data, index=['x', 'y', 'z'], columns=index) 

# Calculate the difference 
sub = df['bar']['one'] - df['flux']['six'] 
print sub 

# Assign that difference to a new column in the object 
df['new', 'col'] = sub 
print df 

Kết quả tương ứng là:

A  bar    flux     new 
B  one  three  six  three  col 
x 0.627915 0.507184 0.690787 1.166318 -0.062872 
y 0.927342 0.788232 1.776677 -0.512259 -0.849335 
z 1.000000 1.000000 1.000000 0.000000 0.000000 
Các vấn đề liên quan