2016-05-05 12 views
1

Ich habe einen Pandas Datenrahmen mit diesen Spalten:Pandas: Umformung und Multi-Index

  • itemid
  • 15/01/2015 Status
  • 15/01/2015 Standort
  • 15/02/2015 Status
  • 15/02/2015 Standort
  • usw.

Wie kann ich diese beiden Dinge tun?

  1. erstellen Multi-indizierten Spalten, wobei der erste Index der Monat ist, und der zweite Index ist die Metrik I Tracking bin (Status, Standort)
  2. Stapel der colum so dass der Tisch etwas wie folgt aussieht:

+--------+-----------+----------+--------+--+ 
 
| itemid | mymonth | location | status | | 
 
+--------+-----------+----------+--------+--+ 
 
| A  | 15/1/2015 | North | Good | | 
 
| A  | 15/2/2015 | South | Bad | | 
 
+--------+-----------+----------+--------+--+

von einem Eingang beginnen, die wie folgt aussieht:

012.351.
+--------+-------------------+---------------------+-------------------+---------------------+ 
| itemid | 15/01/2015 status | 15/01/2015 location | 15/02/2015 status | 15/02/2015 location | 
+--------+-------------------+---------------------+-------------------+---------------------+ 
| A  | Good    | North    | Bad    | South    | 
+--------+-------------------+---------------------+-------------------+---------------------+ 

, die (der Eingang) mit neu erstellt werden: Ich gedacht habe über die Verwendung Schmelze, aber ich bin nicht sicher, ob es funktionieren würde in diesem Zusammenhang

import pandas as pd 
df=pd.DataFrame() 
df['itemid']=['A'] 
df['15/01/2015 status'] = ['Good'] 
df['15/01/2015 location'] = ['North'] 
df['15/02/2015 status'] = ['Bad'] 
df['15/02/2015 location'] = ['South'] 

.

Danke!

+2

Können Sie Probe von Eingangsdatenrahmen hinzufügen, die Ausgabe gewünscht erstellen können? – jezrael

Antwort

1

Sie können stack mit split und letzten pivot_table mit rename_axis (neu in pandas0.18.0) verwenden:

df1 = df.set_index('itemid').stack().reset_index() 
df1.columns = ['itemid','mymonth', 'd'] 

df1[['mymonth','c']] = df1.mymonth.str.split('\s+').apply(pd.Series) 
print df1 
    itemid  mymonth  d   c 
0  A 15/01/2015 Good status 
1  A 15/01/2015 North location 
2  A 15/02/2015 Bad status 
3  A 15/02/2015 South location 

print df1.pivot_table(index=['itemid', 'mymonth'], columns='c', values='d', aggfunc='first') 
     .reset_index() 
     .rename_axis(None, axis=1) 

    itemid  mymonth location status 
0  A 15/01/2015 North Good 
1  A 15/02/2015 South Bad 

EDIT:

Ich denke, wenn durch first Aggregieren Sie manchmal Daten verloren können, weil Sie bringen nur der erste Wert (wenn die Duplizität in Spalten einen neuen Index erzeugt) und andere Werte gehen verloren. Wenn Sie nach Zeichenfolgen aggregieren, können Sie join verwenden. Die Daten werden NICHT verloren, nur verbunden und getrennt durch ,:

print df1.pivot_table(index=['itemid', 'mymonth'], columns='c', values='d',aggfunc=', '.join) 
     .reset_index() 
     .rename_axis(None, axis=1) 
+0

Du bist ein Star! Danke vielmals! –

+1

Vielen Dank für Ihre Annahme. Ich füge nächste Lösung hinzu - ich hatte Angst, weil Sie potentiell verlorene Daten haben können. Bitte überprüfen Sie es und wenn etwas nicht klar ist, kann ich versuchen, es besser zu erklären. – jezrael

+0

Danke. In den speziellen Fällen, an denen ich arbeite, ist das glücklicherweise kein Problem, da die Daten so sind, dass es keine Duplikate gibt. –