2017-08-14 5 views
1

私は、一意でないインデックスを持つデータフレームを持っています。私は、以下に示すように、キーが等しい行の操作を行いたいと思います。 一意のキーごとに、最初の「他の数字」をすべての「数値」列と合計したい。これは、データフレームや時間のかかる操作を分割することなく可能ですか?パンダデータフレームの等しいインデックスの繰り返し操作

import pandas as pd 


d = {'key':['a', 'a', 'b','b'], 
    'numbers':[10,20,30,40], 
    'other_numbers':[1,2,3,4] 
    } 

df = pd.DataFrame(data=d) 
df = df.set_index('key') 

print df 

##  numbers other_numbers new 
## key 
## a  10    1  11 
## a  20    2  21 
## b  30    3  33 
## b  40    4  43 

答えて

1

あなたはffillmethod='ffill'fillna)に置き換えられNaNsためmaskother_numbers列をフィルタリングするために使用されるものを複製し、インデックスの最初の値についてduplicatedを使用することができます:

df['new'] = df['numbers'] + df['other_numbers'].mask(df.index.duplicated()).ffill().astype(int) 
print (df) 
    numbers other_numbers new 
key        
a   10    1 11 
a   20    2 21 
b   30    3 33 
b   40    4 43 

タイミング

np.random.seed(123) 

N = 1000000 

df = pd.DataFrame({'numbers': np.random.randint(20,size=N), 
        'other_numbers': np.random.randint(10,size=N)}, 
        index=np.random.randint(20000,size=N)).sort_index() 
df.index.name = 'key' 
print (df) 

In [83]: %timeit df['new'] = df['numbers'] + df['other_numbers'].mask(df.index.duplicated()).ffill().astype(int) 
10 loops, best of 3: 34.8 ms per loop 

In [84]: %timeit df.assign(new1=df.groupby('key')['other_numbers'].transform('first')+df['numbers']) 
10 loops, best of 3: 64.7 ms per loop 
1

一つの方法は、次のようになります。

In [28]: df.assign(new=df.groupby('key')['other_numbers'].transform('first')+df['numbers']) 
Out[28]: 
    numbers other_numbers new 
key 
a   10    1 11 
a   20    2 21 
b   30    3 33 
b   40    4 43 
関連する問題