首页 > 解决方案 > Python计算组之间单个变量的相关性

问题描述

我想计算面板数据中两组之间变量“小时”的相关性。具体来说,我想计算 A 组和 B 组与 C 组之间的小时数的相关性。因此最终结果将包含两个数字:corr(hours_A, hours_C) 和 corr(hours_B, hours_C)。

我努力了:

data.groupby('group').corr()

但它给了我每组内“小时”和“其他变量”之间的相关性,但我想要两组之间“小时”变量的相关性。我是 Python 新手,所以欢迎任何帮助!

团体 小时 其他变量
一个 2000 2784 567
一个 2001年 2724 567
一个 2002年 2715 567
2000 2301 567
2001年 2612 567
2002年 2489 567
C 2000 2190 567
C 2001年 2139 567
C 2002年 2159 567

更新:

谢谢你回答我的问题!我最终想出了自己的一些代码,但我的代码并不像提供的答案那么优雅。为了它的价值,我把它贴在这里。

df = df.set_index(['group','year'])
df = df.unstack(level=0)
df.index = pd.to_datetime(df.index).year
df.columns = df.columns.rename(['variables',"group"])
df.xs('hours',  level="variables", axis=1).corr()

相关性不需要索引年份,但如果我想稍后创建数据的横截面,它可能会派上用场。

标签: pythoncorrelationpanel-data

解决方案


您可以将列表应用于组,然后转换为系列,转置,然后对数据调用 corr()。

from io import StringIO
import pandas as pd

>>> data = StringIO("""group,year,hours,other,variables
A,2000,2784,567
A,2001,2724,567
A,2002,2715,567
B,2000,2301,567
B,2001,2612,567
B,2002,2489,567
C,2000,2190,567
C,2001,2139,567
C,2002,2159,567""")
>>> df = pd.read_csv(data)
>>> df.groupby('group')['hours'].apply(list).apply(pd.Series).T.corr()

          0         1         2
0  1.000000  0.771752  0.898470
1  0.771752  1.000000  0.972589
2  0.898470  0.972589  1.000000

这是如何运作的?groupby + apply(list) 产生以下内容,这是一个包含三行的系列,每行是三个项目的列表。

A    [2784, 2724, 2715]
B    [2301, 2612, 2489]
C    [2190, 2139, 2159]

apply(pd.Series) 将每行中的列表转换为系列。然后,您必须使用 T 运算符进行转置以在单个列中获取每个组的数据。

          0     1     2
group
A      2784  2724  2715
B      2301  2612  2489
C      2190  2139  2159

transposed is

group     A     B     C
0      2784  2301  2190
1      2724  2612  2139
2      2715  2489  2159

如果你只想要这两个值,那就是

>>> df.groupby('group')['hours'].apply(list).apply(pd.Series).T.corr().iloc[1:3,0].values
array([-0.86594029,  0.86783525])

在此示例中,您使用iloc获取第一列中的第二行和第三行(python 索引从零开始),然后valuesa 的属性Series返回一个数组而不是 a Series


推荐阅读