web-dev-qa-db-ja.com

Pandas Correlation Groupby

以下のようなデータフレームがあると仮定すると、2つの特定の列間の相関関係を取得し、「ID」列でグループ化するにはどうすればよいですか? Pandas 'corr'メソッドはすべての列間の相関関係を見つけると信じています。可能であれば、.agg関数を使用して「groupby」相関関係を見つける方法を知りたいです(つまり、np。相関関係)。

私が持っているもの:

ID  Val1    Val2    OtherData   OtherData
A   5       4       x           x
A   4       5       x           x
A   6       6       x           x
B   4       1       x           x
B   8       2       x           x
B   7       9       x           x
C   4       8       x           x
C   5       5       x           x
C   2       1       x           x

私が必要なもの:

ID  Correlation_Val1_Val2
A   0.12
B   0.22
C   0.05

ありがとう!

20
bsheehy

あなたはほとんどすべての部分を理解しました、それらを組み合わせる必要があるだけです:

>>> df.groupby('ID')[['Val1','Val2']].corr()

             Val1      Val2
ID                         
A  Val1  1.000000  0.500000
   Val2  0.500000  1.000000
B  Val1  1.000000  0.385727
   Val2  0.385727  1.000000

あなたの場合、各IDに2x2を出力するのは非常に冗長です。行列全体の代わりにスカラー相関を出力するオプションは表示されませんが、2つの変数しかない場合は、次のような簡単なことを実行できます。

>>> df.groupby('ID')[['Val1','Val2']].corr().iloc[0::2,-1]

ID       
A   Val1    0.500000
B   Val1    0.385727

3+変数のより一般的な場合

3つ以上の変数の場合、簡潔な出力を作成するのは簡単ではありませんが、次のようなことができます。

groups = list('Val1', 'Val2', 'Val3', 'Val4')
df2 = pd.DataFrame()
for i in range( len(groups)-1): 
    df2 = df2.append( df.groupby('ID')[groups].corr().stack()
                        .loc[:,groups[i],groups[i+1]:].reset_index() )

df2.columns = ['ID', 'v1', 'v2', 'corr']
df2.set_index(['ID','v1','v2']).sort_index()

groupby要素がない場合、numpyの上部または下部の三角形の関数を使用するのは簡単です。しかし、その要素が存在するため、私が知る限り、簡潔な出力をよりエレガントな方法で生成することはそれほど簡単ではありません。

20
JohnE

上記の答えでは、 ixは非推奨になっているため、代わりにilocを使用して、その他の小さな変更を加えます。

df.groupby('ID')[['Val1','Val2']].corr().iloc[0::2][['Val2']] # to get pandas DataFrame

または

df.groupby('ID')[['Val1','Val2']].corr().iloc[0::2]['Val2'] # to get pandas Series
2
Ravaging Care