2017-07-24 1 views
0

Ich gruppiere einen Datenrahmen nach Jahr (es ist eine Ebene eines Multi-Index auf den Spalten), eine Funktion anwendet, die die DF auffüllt haben 11 Spalten (fügen so viele leere Spalten wie nötig hinzu) und geben dann das aufgefüllte df zurück. Aber das wirft einen Fehler auf.ValueError: kann von einer doppelten Achse nicht neu indizieren - keine doppelten Achsenwerte

finalFormat = (penultimateFormatNot11Columns.groupby(level = 'Year', 
                 axis = 1) 
              .apply(padDFToXColumns) 
      ) 




raise ValueError("cannot reindex from a duplicate axis") 

Im Inneren der Polsterung Funktion angewendet wird, die paddedDF, die entweder auf

Achse hat keine duplizierten Ebenen zurückgegeben
>>> paddedDF.index.duplicated().any() 
False 
>>> paddedDF.columns.duplicated().any() 
False 
>>> 

Irgendwelche Ideen, wo dieser Fehler herkommt?

Padding Funktion

def padDFToXColumns(df, TOT_COLUMNS = 11): 
    """ 
    Pad out the number of columns in df to TOT_COLUMNS (add TOT_COLUMNS - len(df) empty columns) 
    """ 

    numColsInDF = len(df.columns) 
    if numColsInDF > TOT_COLUMNS: 
     print("ERROR: Number Of Columns (%s) Exceeds Max Columns (%s)" % (numColsInDF, TOT_COLUMNS)) 
     return 

    ### Add Empty Columns ### 
    numColsToAdd = TOT_COLUMNS - numColsInDF 
    columnsToAdd = [ 'EmptyColumn' + str(num) for num in range(numColsInDF + 1, TOT_COLUMNS + 1) ] 
    emptyColumns = pd.DataFrame(columns = columnsToAdd, index = np.arange(len(df.index))) 

    paddedDF = df.join(emptyColumns) 
    #paddedDF.reset_index(drop = True, inplace = True) 

    return paddedDF 

Datenrahmen

>>> mydata.head() 

    SurveyYear Age  Race Gender WeightAdjusted 
0  1996 39  1.White 1.Female   1039.13 
1  1996 9  1.White 2.Male   995.13 
2  1996 8  1.White 2.Male   775.66 
3  1996 39  1.White 2.Male   404.28 
4  1996 33 3.Hispanic 1.Female   404.28 

>>> groupbyKeys = ['SurveyYear', 'Age', 'Race', 'Gender'] 
>>> cellPopulations = mydata.groupby(groupbyKeys).agg({'WeightAdjusted':'sum'}) 
>>> cellPopulations.head(20) 
            WeightAdjusted 
SurveyYear Age Race  Gender     
1996  0 1.White 1.Female  1204859.60 
          2.Male  1227666.34 
       2.Black 1.Female  307495.16 
          2.Male   263571.07 
       3.Hispanic 1.Female  320359.68 
          2.Male   392902.80 
       4.Asian 1.Female  78615.49 
          2.Male   82341.54 
       5.Other 1.Female  16134.33 
          2.Male   19365.76 
      1 1.White 1.Female  1195134.70 
          2.Male  1195659.14 
       2.Black 1.Female  328376.10 
          2.Male   383293.79 
       3.Hispanic 1.Female  322862.58 
          2.Male   404322.04 
       4.Asian 1.Female  79499.56 
          2.Male   73783.69 
       5.Other 1.Female  20647.55 
          2.Male   24222.52 
>>> unstackKey = ['SurveyYear', 'Age', 'Gender'] 



>>> penultimateFormatNot11Columns = cellPopulations.unstack(unstackKey) 
>>> penultimateFormatNot11Columns 

      WeightAdjusted                          ...                           
SurveyYear   1996                          ...   1997                        
Age     0      1      2      3      4    ...   76     77     78     79     80   
Gender   1.Female  2.Male 1.Female  2.Male 1.Female  2.Male 1.Female  2.Male 1.Female  2.Male ...  1.Female 2.Male 1.Female 2.Male 1.Female 2.Male 1.Female 2.Male 1.Female  2.Male 
Race                               ...                           
1.White  1204859.60 1227666.34 1195134.70 1195659.14 1197386.21 1288700.89 1251324.65 1307458.14 1236790.33 1374989.75 ...  764103.31 506844.04 702775.64 425705.16 666705.33 423419.49 577674.82 366109.58 3898404.40 2283771.11 
2.Black   307495.16 263571.07 328376.10 383293.79 291976.23 326400.85 310870.61 323344.13 301025.43 323199.08 ...  68272.99 43254.98 50082.98 34347.45 50788.70 36772.29 31393.21 20720.47 366569.11 180108.23 
3.Hispanic  320359.68 392902.80 322862.58 404322.04 344564.20 340702.86 303325.65.53 382663.64 311911.38 ...  39084.04 17362.56 27507.45 18803.48 17619.95 24060.91 35665.78 23802.81 174972.00 105530.84 
4.Asian   78615.49 82341.54 79499.56 73783.69 96289.08 88222.32 96411.97 92029.56 77070.10 90370.15 ...  30196.58 27745.90 18419.49 15406.79 7272.27 17891.33 18116.50 3606.67 57684.54 42662.74 
5.Other   16134.33 19365.76 20647.55 24222.52 17469.53 27237.94 11220.90 6996.58 23640.43 14917.77 ...  4441.26  nan 1487.90 2845.89 522.43 2453.52 303.66 2982.57 18870.12 6232.88 
+1

Ich glaube, Sie einige Datenprobe mit Fehlern hinzufügen können, danke. – jezrael

+0

Weitere Informationen zu den zugrunde liegenden Daten und deren Erstellung wurden hinzugefügt. – Nirvan

Antwort

0

Es scheint mir, dass alles, was Sie brauchen pivot_table ist.

zu tun, dass Sie zu df.reset_index(inplace=True) nach groupby() und dann brauchen werden:

df.pivot_table(values='WeightAdjusted', index='Race', columns=['SurveyYear', 'Age', 'Gender']) 
+0

Ich muss eine Datentabelle erstellen, die 11 Spalten für jedes Jahr enthält. In diesem Fall habe ich 10 Spalten für jedes Jahr (2 Geschlechter x 5 Rassen). Ich muss jedes Jahr eine leere Spalte hinzufügen. – Nirvan

+0

Gibt es eine Möglichkeit, dies mit einem Pivot-Tisch zu tun? – Nirvan

+0

Wenn Sie diese Spalte verwenden möchten, um eine Aggregation wie 'mean' durchzuführen, können Sie' margins = True, aggfunc = np.mean' hinzufügen. 'np.mean' ist der Standardwert. – zipa

Verwandte Themen