2012-12-24 29 views
7

Come posso modificare ogni elemento in un DataFrame con indicizzazione gerarchica? Per esempio, forse voglio convertire stringhe in carri allegorici:Modifica dei dati in un dataframe con indicizzazione gerarchica

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 

ho provato questo:

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 

Come potete vedere, cambia l'indicizzazione gerarchica un bel po '. Come posso evitare questo? O forse c'è un modo migliore.

Grazie

risposta

4

passare l'opzione axis alla funzione apply:

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

Quando entrambi gli assi hanno indici gerarchici ecco una soluzione:

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

Grande. Si applica passare le colonne compreso item1, item2 quando uso axis = 0? Cosa succede quando c'è un'indicizzazione gerarchica nelle colonne e nelle righe? –

+0

Uhm ... Ho già provato questo e 'appiattisce' i livelli. Conosci una soluzione per questo? –

+0

@RobertSmith Quale versione di panda stai usando? Non si appiattisce per me in '0.10' (anche se' applymap' lo fa). –