2017-06-26 4 views
0

SQL Serverからpandas形式のデータを抽出しました。Pandas:同じ基準を満たす異なる行からの値の一括置換

df = pd.DataFrame({'Day':(1,2,3,4,1,2,3,4),'State':('A','A','A','A','B','B','B','B'),'Direction':('N','S','N','S','N','S','N','S'),'values':(12,34,22,37,14,16,23,43)}) 

>>> df 
    Day Direction State values 
0 1   N  A  12 
1 2   S  A  34 
2 3   N  A  22 
3 4   S  A  37 
4 1   N  B  14 
5 2   S  B  16 
6 3   N  B  23 
7 4   S  B  43 

今、私は同じ日、同じ方向ではなく(状態== A)と、すべての値を代入したい、それ自体+値で同じ日と同じ状態ではなく(状態== Bと:このような構造)。例えば、次のように:値が異なる行からのものであるので

df.loc[(df.Day == 1) & (df.Direction == 'N') & (df.State == 'A'),'values'] = df.loc[(df.Day == 1) & (df.Direction == 'N') & (df.State == 'A'),'values'].values + df.loc[(df.Day == 1) & (df.Direction == 'N') & (df.State == 'B'),'values'].values 

>>> df 
    Day Direction State values 
0 1   N  A  26 
1 2   S  A  34 
2 3   N  A  22 
3 4   S  A  37 
4 1   N  B  14 
5 2   S  B  16 
6 3   N  B  23 
7 4   S  B  43 

注意最初の行の値がcombine_first関数を使用するので、種類の困難、26(12 + 14) に12から変更されましたか?

ここでは、2つのループ( 'Day'と 'Direction')と上記の帰属文を使用する必要があります。データフレームが大きくなると非常に遅くなります。あなたはこれを行うためのスマートで効率的な方法がありますか?

答えて

1

最初に、同じグループのBからAへの値の追加を行う関数を定義することができます。次に、この機能を各グループに適用します。

def f(x): 
    x.loc[x.State=='A','values']+=x.loc[x.State=='B','values'].iloc[0] 
    return x 

df.groupby(['Day','Direction']).apply(f) 
Out[94]: 
    Day Direction State values 
0 1   N  A  26 
1 2   S  A  50 
2 3   N  A  45 
3 4   S  A  80 
4 1   N  B  14 
5 2   S  B  16 
6 3   N  B  23 
7 4   S  B  43 
+0

oh、groupbyと適用:lovely mate of funcs。初心者としては、自分ができることについて常に最高の気分を味わいますが、それを習得するにはさらに訓練が必要です。多くのありがとう、お嬢様 – lkonweb

+0

心配はいりません。それが役に立つと思ったら答えを受け入れてください。 – Allen

関連する問題