2016-06-03 9 views
1

Ich habe ein pandas.DataFrame mit einem Multi wie:Einstellen eines Pandas Unterdatenrahmen mit einem Multiindex indiziert

In [298]: pd.DataFrame(index=pd.MultiIndex.from_tuples([['a', 1], ['a', 2], ['b', 1], ['b', 3]]), data={'x': 1}) 
Out[298]: 
    x 
a 1 1 
    2 1 
b 1 1 
    3 1 

Wenn ich möchte einen Unterdatenrahmen neu zuzuordnen, dh (df.loc['a']), i eine seltsame Ausgabe:

In [300]: df.loc['a'] = df.loc['a'] 

In [301]: df 
Out[301]: 
     x 
a 1 NaN 
    2 NaN 
b 1 1 
    3 1 

Das Beispiel ist einfach, ich habe offensichtlich die Absicht, eine Neuzuweisung komplizierter zu haben.

Ist das normal? Wie kann ich einen mit einem MultiIndex indizierten Subdatenrahmen neu zuweisen?

+0

Sie können es auf diese Weise tun: 'df.loc [df.index.get_level_values ​​(0) == 'a'] = df' – MaxU

Antwort

0

können Sie verwenden [[..]] (aktualisieren Sie die Datenrahmen statt der Serie):

In [11]: df 
Out[11]: 
    x 
a 1 1 
    2 1 
b 1 1 
    3 1 

In [12]: df2 = pd.DataFrame(index=pd.MultiIndex.from_tuples([['a', 1], ['a', 2], ['b', 1], ['b', 3]]), data={'x': 2}) 

In [13]: df.loc[["a"]] = df2.loc[["a"]] 

In [14]: df 
Out[14]: 
    x 
a 1 2 
    2 2 
b 1 1 
    3 1 
+0

Das fühlt sich seltsam * * ... –

0

können Sie pd.IndexSlice verwenden Scheiben eines pd.MultiIndex

df.loc[pd.IndexSlice['a', :], :] = 2 
print df 

a 1 2 
    2 2 
b 1 1 
    3 1 

Andere Beispiele darstellen

df = pd.DataFrame(index=pd.MultiIndex.from_tuples([['a', 1], ['a', 2], ['b', 1], ['b', 3]]), data={'x': 1}) 

df.loc[pd.IndexSlice[:, 1], :] = 9 

print df 

    x 
a 1 9 
    2 1 
b 1 9 
    3 1 

Oder

df = pd.DataFrame(index=pd.MultiIndex.from_tuples([['a', 1], ['a', 2], ['b', 1], ['b', 3]]), data={'x': 1}) 

df.loc[pd.IndexSlice['b', 3], :] = 31415 

print df 

     x 
a 1  1 
    2  1 
b 1  1 
    3 31415