2016-11-04 2 views
1

Ich versuche, den Mittelwert der Zeilen eines DataFrame zu berechnen, die denselben Wert für eine angegebene Spalte col haben. Jedoch bin ich beim Zuweisen einer Reihe des Pandas DataFrame fest.Kann keine Zeile in Pandas zuweisen.Dataframe

Hier ist mein Code:

def code(data, col): 
    """ Finds average value of all rows that have identical col values from column col . 
     Returns new Pandas.DataFrame with the data 
    """ 
    values = pd.unique(data[col]) 
    rows = len(values) 
    res = pd.DataFrame(np.zeros(shape = (rows, len(data.columns))), columns = data.columns) 
    for i, v in enumerate(values): 
     e = data[data[col] == v].mean().to_frame().transpose() 
     res[i:i+1] = e 
    return res 

Das Problem ist, dass der Code nur für die erste Reihe arbeitet, und legt NaN-Werte auf den nächsten Zeilen. Ich habe den Wert von e überprüft und bestätigt, dass es gut ist, also gibt es ein Problem mit der Zuweisung res[i:i+1] = e. Ich habe auch versucht, res.iloc[i] = e zu tun, aber ich bekomme "ValueError: Inkompatibler Indexer mit Series" Gibt es eine alternative Möglichkeit, dies zu tun? Es scheint sehr einfach und ich bin verwirrt, warum es nicht ...

Eg funktioniert:

wdata 
    Out[78]: 
     Die Subsite Algorithm Vt1   It1   Ignd 
    0  1  0   0 0.0 -2.320000e-07 -4.862400e-08 
    1  1  0   0 0.1 -1.000000e-04 1.000000e-04 
    2  1  0   0 0.2 -1.000000e-03 1.000000e-03 
    3  1  0   0 0.3 -1.000000e-02 1.000000e-02 
    4  1  1   1 0.0 3.554000e-07 -2.012000e-07 
    5  1  2   2 0.0 5.353000e-08 -1.684000e-07 
    6  1  3   3 0.0 9.369400e-08 -2.121400e-08 
    7  1  4   4 0.0 3.286200e-08 -2.093600e-08 
    8  1  5   5 0.0 8.978600e-08 -3.262000e-07 
    9  1  6   6 0.0 3.624800e-08 -2.507600e-08 
    10 1  7   7 0.0 2.957000e-08 -1.993200e-08 
    11 1  8   8 0.0 7.732600e-08 -3.773200e-08 
    12 1  9   9 0.0 9.300000e-08 -3.521200e-08 
    13 1  10   10 0.0 8.468000e-09 -6.990000e-09 
    14 1  11   11 0.0 1.434200e-11 -1.200000e-11 
    15 2  0   0 0.0 8.118000e-11 -5.254000e-11 
    16 2  1   1 0.0 9.322000e-11 -1.359200e-10 
    17 2  2   2 0.0 1.944000e-10 -2.409400e-10 
    18 2  3   3 0.0 7.756000e-11 -8.556000e-11 
    19 2  4   4 0.0 1.260000e-11 -8.618000e-12 
    20 2  5   5 0.0 7.122000e-12 -1.402000e-13 
    21 2  6   6 0.0 6.224000e-11 -2.760000e-11 
    22 2  7   7 0.0 1.133400e-08 -6.566000e-09 
    23 2  8   8 0.0 6.600000e-13 -1.808000e-11 
    24 2  9   9 0.0 6.861000e-08 -4.063400e-08 
    25 2  10   10 0.0 2.743800e-10 -1.336000e-10 

Erwartete Ausgabe:

 Die Subsite Algorithm Vt1  It1  Ignd 
0 1  4.4  4.4 0.04 -0.00074 0.00074 
0 2  5.5  5.5 0 6.792247e-09 -4.023330e-09 

Statt dessen, was ich erhalten ist:

  Die Subsite Algorithm Vt1  It1  Ignd 
    0 1  4.4  4.4 0.04 -0.00074 0.00074 
    0 NaN  NaN  NaN NaN NaN  NaN  

Zum Beispiel ergibt sich dieser Code in:

In[81]: wdata[wdata['Die'] == 2].mean().to_frame().transpose() 
Out[81]: 
    Die Subsite Algorithm Vt1   It1   Ignd 
0 2  5.5  5.5 0 6.792247e-09 -4.023330e-09 
+0

können Sie einige Stichproben ** Daten ** und erwartete Ausgabe hinzufügen? – grubjesic

+0

Was ist 'col' in' code (data, col) '? 'Vt1'? – jezrael

+0

'Col 'eine Zeichenfolge mit dem Spaltennamen. In meinem Fall ist die 'Die' – capitan

Antwort

1

Für mich funktioniert:

def code(data, col): 
    """ Finds average value of all rows that have identical col values from column col . 
     Returns new Pandas.DataFrame with the data 
    """ 
    values = pd.unique(data[col]) 
    rows = len(values) 
    res = pd.DataFrame(columns = data.columns) 
    for i, v in enumerate(values): 
     e = data[data[col] == v].mean() 
     res.loc[i,:] = e 
    return res 

col = 'Die' 
print (code(data, col)) 
    Die Subsite Algorithm Vt1   It1   Ignd 
0 1  4.4  4.4 0.04 -0.000739957 0.000739939 
1 2  5   5  0 7.34067e-09 -4.35482e-09 

aber gleiche Leistung groupby mit Aggregat mean hat:

print (data.groupby(col, as_index=False).mean()) 
    Die Subsite Algorithm Vt1   It1   Ignd 
0 1  4.4  4.4 0.04 -7.399575e-04 7.399392e-04 
1 2  5.0  5.0 0.00 7.340669e-09 -4.354818e-09 
+0

Danke für deine Antwort! Ich benutzte das 'iloc' falsch, es scheint ... – capitan

+0

Ja, auch ich entferne etwas Code. Aber am besten ist 'groupby' mit' mean'. – jezrael

0

Wenige Minuten, nachdem ich das gepostet Frage ich löste es, indem ich .values zu e hinzufüge.

e = data[data[col] == v].mean().to_frame().transpose().values 

Aber es stellt sich heraus, dass das, was ich tun wollte, bereits von Pandas getan wird. Danke MaxU!

df.groupBy(col).mean()