簡體   English   中英

pandas groupby pandas 中兩列之間的協方差

[英]covariance between two columns in pandas groupby pandas

我正在嘗試按組計算兩列之間的協方差。 我正在做以下事情:

A = pd.DataFrame({'group':['A','A','A','A','B','B','B'],
                  'value1':[1,2,3,4,5,6,7],
                  'value2':[8,5,4,3,7,8,8]})

B = A.groupby('group')

B['value1'].cov(B['value2'])

理想情況下,我想獲得 X 和 Y 之間的協方差,而不是整個方差協方差矩陣,因為我只有兩列。

謝謝,

你快到了,只是你不清楚 groupby 對象,請參閱Pandas-GroupBy以獲取更多詳細信息。

對於您的問題,如果我理解正確,您想計算同一組中兩列之間的 cov。

最簡單的一個是使用groupeby.cov函數,它給出組之間的成對 cov。

A.groupby('group').cov()

                value1    value2
group                           
A     value1  1.666667 -2.666667
      value2 -2.666667  4.666667
B     value1  1.000000  0.500000
      value2  0.500000  0.333333

如果你只需要 cov(grouped_v1, grouped_v2)

grouped = A.groupby('group')
grouped.apply(lambda x: x['value1'].cov(x['value2']))

group
A   -2.666667
B    0.500000

其中, grouped是一個groupby對象。 對於grouped.apply函數,它需要一個回調函數作為參數,每個組將作為回調函數的參數。 這里,回調函數是一個lambda函數,參數x是一個組(一個 DataFrame)。

希望對大家理解groupby有所幫助。

以下代碼為您提供了分組方差-協方差矩陣。 您可以根據需要對其進行子集化以獲得協方差。

import pandas as pd
A = pd.DataFrame({'group':['A','A','A','A','B','B','B'],
                  'value1':[1,2,3,4,5,6,7],
                  'value2':[8,5,4,3,7,8,8]})
print A.groupby('group').cov()

如果您正在尋找特定兩列的cov() ,您可以使用df.Age.cov(df.Salary)假設 Age 和salary 是 dataFrame 的許多列中的兩列。 這僅對兩列有用。

這是一個替代解決方案,它估計每個組內的cov(value1, value2) ,但不使用.apply()

import pandas as pd

A = pd.DataFrame({'group':['A','A','A','A','B','B','B'],
                  'value1':[1,2,3,4,5,6,7],
                  'value2':[8,5,4,3,7,8,8]})

B = A.groupby('group')

cov_a_b = B[['value1', 'value2']].cov(ddof=0)['value1'].unstack()['value2']

作為與該問題有些相關的附加說明,在使用 NumPy/Pandas 的方差和協方差實現時應小心,因為它們默認使用 1 的自由度校正(令人困惑的是,NumPy 的實現默認為ddof=0方差)。 這就是我包含ddof=0的原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM