基于State列计算Avg_speed与Death_rate相关性遇空DataFrame问题咨询
解决按State计算Avg Speed与Death Rate相关性返回空DataFrame的问题
嘿,我来帮你梳理下问题出在哪,以及怎么解决:
问题根源分析
你现在的代码返回空DataFrame,主要有两个核心原因:
- 数据读取逻辑错误:你用了
header=None,这会把CSV里的表头行(就是state death_rate avg_speed那一行)当成普通数据行处理,再加上usecols=[1,2]只取后两列,导致读取到的数据混进了字符串类型的表头值,pandas没法正常计算数值相关性。 - 缺少分组计算逻辑:你想要的是按每个state单独计算两列的相关性,但现有代码直接对整个数据集做了corr,完全没用到state列的分组功能。
修正后的完整代码
第一步:正确读取数据
先确保读取到正确的列和表头:
import pandas as pd import numpy as np # 读取CSV,指定需要的列,让pandas自动识别第一行为表头 dataset = pd.read_csv('result.csv', usecols=['state', 'death_rate', 'avg_speed'])
第二步:按State分组计算相关性
我们用groupby结合自定义函数,对每个state的子数据集单独计算相关性:
# 定义计算单组相关性的函数 def get_group_corr(group): # 计算avg_speed和death_rate的皮尔逊相关系数 corr_value = group['avg_speed'].corr(group['death_rate']) # 返回结构化结果,方便后续合并成DataFrame return pd.Series({'correlation': corr_value}) # 按state分组,应用函数计算每个组的相关性 result = dataset.groupby('state').apply(get_group_corr).reset_index()
第三步:美观展示结果
现在result是包含每个state对应相关性的DataFrame,你可以用几种方式展示:
- 直接打印基础结果:
print(result)
输出示例:
state correlation
0 AL (对应相关系数值)
1 AK (对应相关系数值)
...
- 格式化打印(保留4位小数):
print(result.style.format({'correlation': '{:.4f}'}))
- 可视化展示(柱状图):
如果想更直观看到每个state的相关性差异,可以用matplotlib绘图:
import matplotlib.pyplot as plt result.plot(kind='bar', x='state', y='correlation', figsize=(10,6), title='Correlation between Avg Speed and Death Rate by State') plt.ylabel('Pearson Correlation Coefficient') plt.show()
补充说明
皮尔逊相关系数的范围是[-1,1]:
- 接近1:表示两列数据正相关(avg_speed越高,death_rate越高)
- 接近-1:表示负相关(avg_speed越高,death_rate越低)
- 接近0:表示几乎没有线性相关性
内容的提问来源于stack exchange,提问作者saad
相关产品推荐
相关产品推荐

