2012-12-24 42 views
7

Làm cách nào để thay đổi mọi phần tử trong một DataFrame bằng chỉ mục phân cấp? Ví dụ, có lẽ tôi muốn chuyển đổi chuỗi thành nổi:Thay đổi dữ liệu trong một khung dữ liệu với chỉ mục phân cấp

from pandas import DataFrame 
f = DataFrame({'a': ['1,000','2,000','3,000'], 'b': ['2,000','3,000','4,000']}) 
f.columns = [['level1', 'level1'],['item1', 'item2']] 
f 
Out[152]: 
     level1 
    item1 item2 
0 1,000 2,000 
1 2,000 3,000 
2 3,000 4,000 

Tôi cố gắng này:

def clean(group): 
    group = group.map(lambda x: x.replace(',', '')) 
    return group 
f.apply(clean) 
Out[153]: 
(level1, item1) (level1, item2) 
0 1000 2000 
1 2000 3000 
2 3000 4000 

Như bạn thấy, nó thay đổi việc lập chỉ mục thứ bậc khá một chút. Làm thế nào tôi có thể tránh điều này? Hoặc có thể có một cách tốt hơn.

Cảm ơn

Trả lời

4

Vượt qua tùy chọn axis đến apply chức năng:

In [265]: f.apply(clean, axis=1) 
Out[265]: 
    level1 
    item1 item2 
0 1000 2000 
1 2000 3000 
2 3000 4000 

Khi cả hai trục có chỉ số thứ bậc, đây là một cách giải quyết:

In [316]: f.index = [[1,2,3],[1,2,3]] 

In [317]: f 
Out[317]: 
    level1 
    item1 item2 
1 1 1,000 2,000 
2 2 2,000 3,000 
3 3 3,000 4,000 

In [314]: f.apply(clean, axis=1).reindex(f.index) 
Out[314]: 
    level1 
    item1 item2 
1 1 1000 2000 
2 2 2000 3000 
3 3 3000 4000 
+0

vĩ đại. Có áp dụng vượt qua các cột bao gồm item1, item2 khi tôi sử dụng trục = 0? Điều gì xảy ra khi có một chỉ mục phân cấp trong các cột và các hàng? –

+0

Uhm ... Tôi đã thử điều này và nó "làm phẳng" các cấp độ. Bạn có biết một sửa chữa cho điều này? –

+0

@RobertSmith Bạn đang sử dụng phiên bản gấu trúc nào? Nó không flatten cho tôi trên '0.10' (mặc dù' applymap' hiện). –

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