2016-07-18 2 views
2

私は、これは同じインデックスの連続した列を追加します知っている:追加列

df['C'] = df['A'] + df['B']

しかし、どのように異なるインデックスの列を追加するには:

は、私はこのようなデータフレームを持っているとしましょう:

df 
    A B  
0 9 40 
1 1 70 
2 5 80 
3 8 30 
4 7 50 

別の列Cを作成する必要があります。これは現在のインデックス行の列を追加したものですすなわち、 IDX)とのようなカラムBの前インデックス行(即ちIDX-1):

df 
    A B C 
0 9 40 (9) 
1 1 70 (40 + 1) 
2 5 80 (70 + 5) 
3 8 30 (80 + 8) 
4 7 50 (30 + 7) 

最終結果は次のようになります

df 
    A B C 
0 9 40 9 
1 1 70 41 
2 5 80 75 
3 8 30 88 
4 7 50 37 

答えて

5

あなたがSeries.shiftを使用することができます。

df['C'] = df['A'] + df['B'].shift(1).fillna(0) 
1

Series.addとAmotherソリューション:

df['C'] = df['A'].add(df['B'].shift(), fill_value=0) 
print (df) 
    A B  C 
0 9 40 9.0 
1 1 70 41.0 
2 5 80 75.0 
3 8 30 88.0 
4 7 50 37.0 

タイミング

In [2]: %timeit df['C'] = df['A'].add(df['B'].shift(), fill_value=0) 
1000 loops, best of 3: 457 µs per loop 

In [3]: %timeit df['C1'] = df['A'] + df['B'].shift(1).fillna(0) 
1000 loops, best of 3: 544 µs per loop 

必要な機能がある場合は、列名を追加できます(別のソリューションでも同様)。

def f(a,b,c): 
    df[c] = df[a].add(df[b].shift(), fill_value=0) 
    return df 

print (f('A','B','C')) 
    A B  C 
0 9 40 9.0 
1 1 70 41.0 
2 5 80 75.0 
3 8 30 88.0 
4 7 50 37.0 
+0

優雅なソリューション。ありがとう。これを関数に入れる方法はありますか?明示的に列名を記述する必要はありませんか? – DevEx

+0

私はあなたを正しく理解しているかどうかはわかりませんが、私は解決策を追加しようとしています。 – jezrael