2014-02-18 14 views
7

Ich habe einen großen Datenrahmen mit meinen Daten darin, und einen anderen Datenrahmen der gleichen ersten Dimension, die Metadaten über jeden Zeitpunkt enthält (zB welche Testnummer es war, welcher Versuchstyp es war).Pandas: Verwenden Sie mehrere Spalten eines Datenrahmens als Index eines anderen

Ich möchte den großen Datenrahmen mit den Werten des "metadataframe" teilen. Ich möchte diese getrennt halten (anstatt den Metadatenrahmen als Multiindex des größeren zu speichern).

Gerade jetzt, ich versuche, so etwas zu tun:

def my_func(container): 
    container.big_df.set_index(container.meta_df[['col1', 'col2']]) 
    container.big_df.loc['col1val', 'col2val'].plot() 

Doch diese gibt die folgende Fehlermeldung:

ValueError: Must pass DataFrame with boolean values only 

Beachten Sie, dass dies funktioniert gut, wenn ich eine einzelne Säule passieren nur zu set_index.

Kann jemand herausfinden, was hier falsch läuft? Alternativ kann mir jemand sagen, dass ich das auf eine total dumme und hacky Weise mache, und dass es einen viel besseren Weg gibt, darüber zu gehen? :)

meine Lösung

Danke für die Ideen. Ich habe mit der Indizierung ein wenig herumgespielt, und das scheint die einfachste/schnellste zu sein. Ich mochte es nicht, den Index seines Namens zu streichen, und die Übertragung der Werte usw. schien umständlich. Ich erkannte, etwas interessantes (und wahrscheinlich wert leicht Befestigung):

dfa.set_index(dfb[['col1', 'col2']]) 

nicht funktioniert, aber

dfa.set_index([dfb.col1, dfb.col2]) 

tut.

So können Sie im Grunde dfb in eine Liste von Spalten drehen, set_index Arbeit zu machen, die durch die folgende Konvention:

dfa.set_index([dfb[col] for col in ['col1', 'col2']]) 

Antwort

7

Verwenden MultiIndex.from_arrays() das Index-Objekt zu erstellen:

import pandas as pd 
df1 = pd.DataFrame({"A":[1,2,3], "B":["a","b","c"]}) 
df2 = pd.DataFrame({"C":[100,200,300]}) 
df2.index = pd.MultiIndex.from_arrays(df1.values.T) 

print df2 

das Ergebnis :

 C 
1 a 100 
2 b 200 
3 c 300 
1

ändern Sie Ihre erste Zeile:

container.big_df.index=pd.MultiIndex.from_arrays(container.meta_df[['col1', 'col2']].values.T, names=['i1','i2']) 
Verwandte Themen