【问题标题】:How do I generate the Correlation Coefficient of two columns of a dataframe as a new column variable in the same dataframe?如何将数据帧的两列的相关系数生成为同一数据帧中的新列变量?
【发布时间】:2018-03-30 11:29:08
【问题描述】:

我有一个包含三列的数据框。 ID 用作我要使用 groupby 命令的标识符。在这里,我想为每个 ID 生成 A 和 B 之间的相关系数。这就是我的数据框的样子:

ID  A  B
1   5  7
1   3  4
2   4  5
2   7  6
2   9  1

我想把它转换成下面的数据框:

ID  A  B  Corr_Coeff
1   5  7  <Value 1> 
1   3  4  <Value 1>
2   4  5  <Value 2> 
2   7  6  <Value 2>
2   9  1  <Value 2>

这是我目前正在使用但似乎不起作用的代码:

df['Corr_Coeff'] = df.groupby('ID')[['A','B']].corr()

如果有人可以在这里帮助我,那就太好了!提前致谢。

【问题讨论】:

  • 为什么这是“受保护的”?我可能不理解规则,但还没有接受/赞成的答案,而且单个答案甚至没有 1 票(甚至没有来自“保护”问题的版主)...
  • @Ernest Kiwele 因为 2 个垃圾邮件答案。已删除。

标签: python pandas correlation


【解决方案1】:

我相信需要map,通过iloc按位置选择行,删除MultiIndex使用reset_index

df1 = df.groupby('ID')[['A','B']].corr()
print (df1)
             A         B
ID                      
1  A  1.000000  1.000000
   B  1.000000  1.000000
2  A  1.000000 -0.675845
   B -0.675845  1.000000

df['corr'] = df['ID'].map(df1.iloc[0::2, 1].reset_index(level=1, drop=True))
print (df)
   ID  A  B      corr
0   1  5  7  1.000000
1   1  3  4  1.000000
2   2  4  5 -0.675845
3   2  7  6 -0.675845
4   2  9  1 -0.675845

通过corrwith 创建映射Series 的替代方法,最后将1 column Dataframe 转换为Series by DataFrame.squeeze

s = (df[['A']].groupby(df['ID']).corrwith(df['B'])).squeeze()
print(s)
ID
1    1.000000
2   -0.675845
Name: A, dtype: float64

df['corr'] = df['ID'].map(s)
print (df)
   ID  A  B      corr
0   1  5  7  1.000000
1   1  3  4  1.000000
2   2  4  5 -0.675845
3   2  7  6 -0.675845
4   2  9  1 -0.675845

【讨论】:

    猜你喜欢
    • 2021-07-25
    • 1970-01-01
    • 1970-01-01
    • 2020-07-10
    • 1970-01-01
    • 1970-01-01
    • 2019-12-14
    • 1970-01-01
    • 2017-01-03
    相关资源
    最近更新 更多