2017-07-07 12 views
0

Buddys行を選択するには:私はのようなデータフレームを持っている:パンダ:GROUPBY機能内のいくつかの基準のパリで

df = pd.DataFrame({'code':'A','A','A','A','A','A','B','B','B', 'B','B','B'), 'Times': (1,2,3,4,5,6,1,2,3,4,5,6),'Figure':(2.3,4.1,5.2,7.0,1.8,9.0,4.2,7.9,4.6,1.4,9.7,1.2)}) 

ので、このような構造:

>>> df 
    Figure Times code 
0  2.3  1 A 
1  4.1  2 A 
2  5.2  3 A 
3  7.0  4 A 
4  1.8  5 A 
5  9.0  6 A 
6  4.2  1 B 
7  7.9  2 B 
8  4.6  3 B 
9  1.4  4 B 
10  9.7  5 B 
11  1.2  6 B 

は、今私は、各コード内にしたいがグループ( 'A'、 'B')は、[[4,1]、[6,1]、[3,2]]でTimesがペアになっている場合にのみFigureの差分を計算します。だから、希望する新しいデータフレームは、この希望:もちろん

>>> newdf 
    code diffFigure diffTimes 
0 A   4.7  4-1 
1 A   6.7  3-2 
2 A   1.1  6-1 
3 B  -3.3  4-1 
4 B  -2.8  3-2 
5 B  -3.0  6-1 

を、私はGROUPBY関数を使用して関数を適用したいと思います:

def f(x): 
    myList = [[4,1],[6,1],[3,2]] 
    for i in x.itertuples(): 
     for j in x.itertuples(): 
      if (i.Times, j.Times) in myList: 
       print (i.code + ": " + str(i.Times) + "-" + str(j.Times) + "=" + str(i.Figure - j.Figure)) 
newdf = df.groupby('code').apply(f) 

しかし、私は希望のデータフレームを取得傾けます。ここでは2つの問題:まず、すべての行を列挙するためにitertuplesを使用しない可能性のある方法はありますか?次に、関数fで、希望のデータフレームを得るためにリターン形式を設計する方法は?

多くのおかげ

答えて

0

2つの解決策:

どちらの作る使用.unstack()の:forループで

df = pd.DataFrame({'code':('A','A','A','A','A','A','B','B','B', 'B','B','B'), 'Times': (1,2,3,4,5,6,1,2,3,4,5,6),'Figure':(2.3,4.1,5.2,7.0,1.8,9.0,4.2,7.9,4.6,1.4,9.7,1.2)}) 
df = df.set_index(["code","Times"]).unstack() 

と手動の違いを連結、すなわち:

myList = [[4,1],[6,1],[3,2]] 
pd.concat(((df[('Figure',d1)] - df[('Figure',d0)]).to_frame('diffFigure').assign(diffTimes="{}-{}".format(d1,d0)) for (d1,d0) in myList)) 

または可能なすべての組み合わせのリストを作成する各コードに:共有の

df0 = df0.merge(pd.DataFrame(myList, columns = ['Times_x','Times_y'])) 
df0['diffFigure'] = df0.Figure_x - df0.Figure_y 
df0['diffTimes'] = df0.Times_x.astype(str) + '-' + df0.Times_y.astype(str) 

df0[['code','diffFigure','diffTimes']] 
+0

ありがとう:

df0 = df.merge(df, on = 'code') 

そして結合操作データフレームにmyListを回すと内側を行うことによってmyListにあるペアのサブセットを取ります。私は、第2の解決策がTimesのすべての組み合わせを考慮するので、第1の解決策を優先し、より多くの失効を有する可能性がある。 – lkonweb

+0

相対的なパフォーマンスは、あなたが 'myList'に持っているエントリの数にも依存します。 pandas関数の呼び出しは一般的に遅いので、forループを何度も繰り返す必要がある場合は、データをメモリに収めることができる限り、大きなマージ、計算、およびサブセットを行うほうが速くなります。 –

関連する問題