2017-05-08 7 views
0

Ich habe einen Pandas-Datenrahmen mit einem Multiindex. Stufe 0 ist "Belastung" und Stufe 1 ist "JGI-Bibliothek". Jedem 'Strain' sind mehrere 'JGI library' Spalten zugeordnet. Ich würde gerne eine Lambda-Funktion verwenden, um einen t-Test anzuwenden, um zwei verschiedene Stämme zu vergleichen. Zur Problembehandlung habe ich eine Zeile meines Datenrahmens mit dem Befehl .iloc [0] erstellt.Zugreifen auf Gruppen in Pandas Lambda-Funktion

row = pvalDf.iloc[0] 
parent = 'LL1004' 
child = 'LL345' 
ttest_ind(row.groupby(level='Strain').get_group(parent), row.groupby(level='Strain').get_group(child))[1] 

Dies funktioniert wie erwartet. Jetzt versuche ich es meinen ganzen Datenrahmen anzuwenden

parent = 'LL1004' 
child = 'LL345' 
pvalDf = countsDf4.apply(lambda row: ttest_ind(row.groupby(level='Strain').get_group(parent), row.groupby(level='Strain').get_group(child))[1]) 

Jetzt habe ich eine Fehlermeldung sagen: „Valueerror: (‚Level Name Stamm ist nicht der Name des Index‘,‚trat bei Index (LL1004, BCHAC) ') "

' LL1004 'ist eine' Belastung ', aber Pandas scheint sich dessen nicht bewusst zu sein. Sieht so aus, als ob der Multiindex nicht korrekt an die Lambda-Funktion übergeben wurde? Gibt es eine bessere Möglichkeit, Lambda-Funktionen zu beheben als mit .iloc [0]?

habe ich eine Kopie meines Jupyter Notebook und eine Excel mit dem countsDf4 Datenrahmen auf Github https://github.com/danolson1/pandas_ttest

Danke, Dan

Antwort

0

Wie sei es, einfache Datei:

pvalDf = countsDf4.apply(lambda row: ttest_ind(row[parent], row[child]), axis=1) 

I‘ Ich habe es auf Ihrem Notebook getestet und es funktioniert.

Ihr Problem ist, dass DataFrame.apply() standardmäßig die Funktion auf jede Spalte, nicht auf jede Zeile anwendet. Sie müssen also den Parameter axis=1 angeben, um das Standardverhalten zu überschreiben und die Funktion Zeile für Zeile anzuwenden.

Auch gibt es keinen Grund zu verwenden , wenn Sie einfach die Gruppe von Spalten von row[x] indizieren können. :)

+0

'Achse = 1' löste das Problem. Und danke für den anderen Kommentar. –

Verwandte Themen