两列相对于固定列的相关性

时间:2018-04-01 23:32:04

标签: python pandas

我的数据集有3列(state,death_rate,avg_speed)

我想找到avg_speed和death_rate之间关于状态

的相关性

我尝试了这个,但它返回了一个空的数据框

import pandas as pd
import numpy as np
dataset = pd.read_csv('result.csv', header=None, usecols=[1,2]) #read 
result = dataset.corr()
print result

以及如何表示结果?

编辑:

这里是样本数据

state    death_rate     avg_speed
AL         50          43.08966565
AK         42          12.16736296
AZ         52          43.33464079
AR         28          36.88461538
CA         30          48.74048562
CO         28          27.54417671
CT         26          23.10909091
FL         18          58.58169492
GA         86          43.55456453
HI         95          66.83672039
ID         99          30.63928113
IL         98          25.06262626

2 个答案:

答案 0 :(得分:0)

@bunji提出了一个很好的观点。实际上,根据您的示例数据存在几个问题:

  1. header不应设置为None,因为您有标题;
  2. 您可能需要根据数据适当设置sepdelimiter。您提供的示例数据似乎不是标准格式。我尝试了空格和制表符(\t)并且都没有工作。
  3. 您可以尝试打印dataset或致电dataset.columns以检查您是否已正确阅读。

答案 1 :(得分:0)

这里有一些不同的问题......

您提供的数据样本不允许您计算每个州的相关性,因为每个州只有1行。因此,我稍微修改了您的数据示例,以便以下示例有效。我假设在您的实际数据文件中,每个州有多行。以下是我正在使用的内容:

state    death_rate     avg_speed
AL         50          43.08966565
AL         42          12.16736296
AL         52          43.33464079
CA         28          36.88461538
CA         30          48.74048562
CA         28          27.54417671
CA         26          23.10909091
FL         18          58.58169492
FL         86          43.55456453
AL         95          66.83672039
AL         99          30.63928113
FL         98          25.06262626

正如一些评论中所提到的,您不应该使用header=None,因为您的数据文件确实包含标题行。此外,您需要导入所有列而不是将其限制为2,因此您应省略usecols=[1,2]

看起来您的输入数据是以空格分隔的,因此您需要使用delim_whitespace正确导入它。这样您就可以将数据正确导入数据框

df = pd.read_csv("result.csv", delim_whitespace=True)

要为每个州分别计算death_rateavg_speed之间的相关性,您需要在使用groupby之前使用corr()。此外,corr()会给你一个相关矩阵,但我猜你只想要每个州的单一相关值。我们可以通过在计算相关矩阵后整理数据帧来实现这一点

首先我们分组state并计算相关矩阵:

result = df.groupby('state').corr()

                  avg_speed  death_rate
state                                  
AL    avg_speed    1.000000    0.482542
      death_rate   0.482542    1.000000
CA    avg_speed    1.000000    0.922646
      death_rate   0.922646    1.000000
FL    avg_speed    1.000000   -0.903176
      death_rate  -0.903176    1.000000

然后我们重置索引并拉出状态和其他列之一(另一列只包含重复信息,因为你只处理2个变量):

result = result.reset_index()[['state', 'avg_speed']]

  state  avg_speed
0    AL   1.000000
1    AL   0.482542
2    CA   1.000000
3    CA   0.922646
4    FL   1.000000
5    FL  -0.903176

最后,删除相关性为1的行,并可选择将列重命名为更合理的行:

result = result[~result['avg_speed'].eq(1)].rename(columns={'avg_speed': 'corr'})

哪个会给你:

  state      corr
1    AL  0.482542
3    CA  0.922646
5    FL -0.903176