2016-04-22 21 views
0

Ich habe ein Beispiel Datenrahmen sieht wie folgt aus. Ich möchte eine Berechnung machen und dann das Ergebnis als neue Spalte an den aktuellen Datenrahmen anhängen.Join entsprechende Spalte zu Dataframe Pandas

A, B # this is my df, a csv file 
1, 2 
3, 3 
7, 6 
13, 14 

Unten ist ein Code, den ich ausprobiert habe.

for i in range(0,len(df.index)+1,1):  
    if len(df.index)-1 == i: 
     df['C'] = str(df.iloc[i]['A']/df.iloc[i]['B']) 
    else: 
     df['C'] = str((df.iloc[i+1]['A'] - df.iloc[i]['A'])/(df.iloc[i+1]['B'] - df.iloc[i]['B'])) # I need string as dtype 

     df.to_csv(Out, index = False) 

Dies gibt mir nur das Ergebnis der Endlosschleife, nicht das entsprechende Ergebnis in Abhängigkeit von jeder Berechnung.

A B C 
1 2 2 
3 3 1.33 
7 6 0.75 
13 14 0.93 # It is the result I'd like to see. 

Kann jemand es überarbeiten? Danke im Voraus!

Antwort

2

UPDATE: - viel elegantere Lösung (Einzeiler) aus @root:

In [131]: df['C'] = (df.A.shift(-1).sub(df.A, fill_value=0)/df.B.shift(-1).sub(df.B, fill_value=0)).round(2).astype(str) 

In [132]: df 
Out[132]: 
    A B  C 
0 1 2 2.0 
1 3 3 1.33 
2 7 6 0.75 
3 13 14 0.93 

In [133]: df.dtypes 
Out[133]: 
A  int64 
B  int64 
C object 
dtype: object 

Sie können es auf diese Weise tun:

df['C'] = (df.A.shift(-1) - df.A)/(df.B.shift(-1) - df.B) 
df.loc[df.index.max(), 'C'] = df.loc[df.index.max(), 'A']/df.loc[df.index.max(), 'B'] 
df.round(2) 

ergibt:

In [118]: df.round(2) 
Out[118]: 
    A B  C 
0 1 2 2.00 
1 3 3 1.33 
2 7 6 0.75 
3 13 14 0.93 
+2

Sie können 'sub' anstelle eines Minuszeichens verwenden und das Schlüsselwortargument' fill_value = 0' angeben, um alles in einer Zeile auszuführen. z.B. 'df.A.shift (-1) & sub0; (df.A, fill_value = 0)/(df.B.shift (-1) & sub0; df.B, fill_value = 0)' – root

+0

@root, ja, in der Tat - es ist viel eleganter, danke! Ich habe die Antwort aktualisiert – MaxU

+0

Kein Problem.Ich hatte eine gröbere Lösung mit 'fill_value' aber sah nicht die nette Lösung, bis ich Ihre Antwort sah! – root