2013-09-04 22 views
17

zu entfernen habe ich eine Series von einem DataFrame, wenn ich ein paar Daten mit einer Zählung wie so neu abgetastete: wo H2 a DataFrame:Pandas Index Serie Reset Multiindex

H3=H2[['SOLD_PRICE']] 
    H5=H3.resample('Q',how='count') 
    H6=pd.rolling_mean(H5,4) 

Diese eine Reihe ergab, das aussieht wie folgt aus:

1999-03-31 SOLD_PRICE  NaN 
1999-06-30 SOLD_PRICE  NaN 
1999-09-30 SOLD_PRICE  NaN 
1999-12-31 SOLD_PRICE 3.00 
2000-03-31 SOLD_PRICE 3.00 

mit einem Index, der wie folgt aussieht:

MultiIndex 
[(1999-03-31 00:00:00, u'SOLD_PRICE'), (1999-06-30 00:00:00, u'SOLD_PRICE'), (1999-09-30 00:00:00, u'SOLD_PRICE'), (1999-12-31 00:00:00, u'SOLD_PRICE'),..... 

Ich möchte nicht die zweite Spalte als Index. Idealerweise hätte ich eine DataFrame mit Spalte 1 als "Datum" und Spalte 2 als "Sales" (die zweite Ebene des Index fallen lassen). Ich sehe nicht wirklich, wie ich den Index neu konfiguriere.

+3

nur eine allgemeine Bemerkung: Benennen Sie Ihre Variablen mit Zahlen, welche die Reihenfolge, in der Sie verwenden sie a Rezept für eine Katastrophe. Man beachte den pathologischen Fall, in dem 'Pandas' nicht' DataFrame' oder 'Series' hatten und sie nur' DataStructure1' und 'DataStructure2' genannt wurden und alle ihre Methoden nur' method1', 'method2' und so weiter genannt wurden . Wenn Sie Ihren Variablen aussagekräftige Namen geben, wird Ihr Code für andere, die ihn zum ersten Mal lesen, lesbar. Indem Sie Ihren Variablen aussagekräftige Namen geben, können Sie innerhalb eines Monats wieder zu Ihrem Code zurückkehren und schnell wieder auf den neuesten Stand gebracht werden. –

+0

Guter Rat, Danke nochmal – dartdog

Antwort

30

Rufen Sie einfach reset_index():

In [130]: s 
Out[130]: 
0   1 
1999-03-31 SOLD_PRICE NaN 
1999-06-30 SOLD_PRICE NaN 
1999-09-30 SOLD_PRICE NaN 
1999-12-31 SOLD_PRICE  3 
2000-03-31 SOLD_PRICE  3 
Name: 2, dtype: float64 

In [131]: s.reset_index() 
Out[131]: 
      0   1 2 
0 1999-03-31 SOLD_PRICE NaN 
1 1999-06-30 SOLD_PRICE NaN 
2 1999-09-30 SOLD_PRICE NaN 
3 1999-12-31 SOLD_PRICE 3 
4 2000-03-31 SOLD_PRICE 3 

Es gibt viele Möglichkeiten Spalten fallen zu lassen:

Anruf reset_index() zweimal und geben Sie eine Spalte:

In [136]: s.reset_index(0).reset_index(drop=True) 
Out[136]: 
      0 2 
0 1999-03-31 NaN 
1 1999-06-30 NaN 
2 1999-09-30 NaN 
3 1999-12-31 3 
4 2000-03-31 3 

die Spalte löschen, nachdem der Index Zurücksetzen:

In [137]: df = s.reset_index() 

In [138]: df 
Out[138]: 
      0   1 2 
0 1999-03-31 SOLD_PRICE NaN 
1 1999-06-30 SOLD_PRICE NaN 
2 1999-09-30 SOLD_PRICE NaN 
3 1999-12-31 SOLD_PRICE 3 
4 2000-03-31 SOLD_PRICE 3 

In [139]: del df[1] 

In [140]: df 
Out[140]: 
      0 2 
0 1999-03-31 NaN 
1 1999-06-30 NaN 
2 1999-09-30 NaN 
3 1999-12-31 3 
4 2000-03-31 3 

Anruf nach dem Zurücksetzen:

In [144]: s.reset_index().drop(1, axis=1) 
Out[144]: 
      0 2 
0 1999-03-31 NaN 
1 1999-06-30 NaN 
2 1999-09-30 NaN 
3 1999-12-31 3 
4 2000-03-31 3 

Dann, nachdem Sie Ihren Index zurückgesetzt haben, benennen Sie die Spalten

In [146]: df.columns = ['Date', 'Sales'] 

In [147]: df 
Out[147]: 
     Date Sales 
0 1999-03-31 NaN 
1 1999-06-30 NaN 
2 1999-09-30 NaN 
3 1999-12-31  3 
4 2000-03-31  3 
13

Wenn Sie doppelte eckige Klammern verwenden, wie

H3 = H2[['SOLD_PRICE']] 

H3 wird zu einem DataFrame. Wenn Sie einzelne Klammern verwenden, wird H3 zu einer Serie:

. Wenn H3 eine Serie ist, dann folgt natürlich das Ergebnis, das Sie sich wünschen:

import pandas as pd 
import numpy as np 
rng = pd.date_range('1/1/2011', periods=72, freq='M') 
H2 = pd.DataFrame(np.arange(len(rng)), index=rng, columns=['SOLD_PRICE']) 
H3 = H2['SOLD_PRICE'] 
H5 = H3.resample('Q', how='count') 
H6 = pd.rolling_mean(H5,4) 
print(H6.head()) 

ergibt

2011-03-31 NaN 
2011-06-30 NaN 
2011-09-30 NaN 
2011-12-31  3 
2012-03-31  3 
dtype: float64 
+0

+1 Elegant, wie immer :) –

+0

Ich mag das auch !! Schwer zu wählen ... Beide von euch sind wie Engel, die auf meiner Schulter sitzen, während ich darum kämpfe, mich auf den neuesten Stand zu bringen. Es sind Leute wie du, die die Python Community für Neulinge so toll machen.Danke + unutbu und + Phillip Cloud – dartdog

+0

Tatsache ist, dass dies die Lösung ist, die ich benutze, aber ich muss auch verstehen, wie man das Serienobjekt besser manipuliert, was Phillip erklärt. – dartdog