2016-04-22 10 views
0

私は以下のようなデータフレームを持っています。私は計算をして、現在のデータフレームに新しい列として結果を追加したいと思います。対応する列をデータフレームのパンダに結合

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

以下は私が試したコードです。

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) 

これは最終的なループの結果を示していますが、計算結果によっては結果が一致しません。

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. 

誰でも修正方法を知っていますか?前もって感謝します!

答えて

2

UPDATE: - はるかにエレガントなソリューション(ワンライナー)@rootから:

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) 

利回り:

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 

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 

あなたは、このようにそれを行うことができます

+2

マイナス記号の代わりに 'sub'を使用し、' fill_value = 0'というキーワード引数を指定すると、すべて1行で入力できます。例えば(df.B、fill_value = 0) ' – root

+0

@root、yes、実際にはもっとエレガントです、ありがとうございました!私は答えを更新しました – MaxU

+0

問題はありません。私はあなたの答えを見てまで、私は 'fill_value'を使ってより大規模な解決策を持っていました。 – root

関連する問題