【问题标题】:Pandas df.corr() returns nan when np.corrcoef() returns values unless NaNs in dataset当 np.corrcoef() 返回值时,熊猫 df.corr() 返回 nan,除非数据集中有 NaN
【发布时间】:2020-06-04 21:41:54
【问题描述】:

我的问题与pandas df.corr() returns NaN despite data fed having populated data 非常相似,但其中给出的解决方案对我不起作用,因为我的数据dtypes: float64(2)describe() 返回non-null float64

我正在使用 pandas:0.19.0 和 python 2.7

我有两个数据框,其中有一列名为WindSp_mean 的非空浮点数据。我通过循环访问主数据集中的一组指定日期来创建这两个日期帧,以根据另一列中的唯一标识符为每个时间步创建 df_turbine0df_turbine1

对于每个时间步,我想计算两个数据帧中 WindSp_mean 列之间的 pearson 相关系数。一些数据帧可能包含 nans,所以我想使用 df.corr() 来查找它们的 WindSp_meancolumns 而不是 np.corrcoef() 之间的 pearson 相关性

通过将第一个 df 中的 WindSp_mean 与其自身进行比较来测试 df.corr(),得到预期答案 1。

pcorr1 = df_turbine0['WindSp_mean'].corr(df_turbine0['WindSp_mean'])

在两个数据框的同一列中尝试此操作

pcorr2 = df_turbine0['WindSp_mean'].corr(df_turbine1['WindSp_mean'])

尽管两列中有 144 个非空浮点数,但仍返回 nan。

如果我使用具有相同值的np.corrcoef()。`

turbine0_windspeed = df_turbine0['WindSp_mean']
turbine1_windspeed = df_turbine1['WindSp_mean']
pcorr1 = np.corrcoef(turbine1_windspeed, turbine0_windspeed)

我的循环中所有时间步长的值都接近 1,直到一些 nan 用 ValueError: all the input array dimensions except for the concatenation axis must match exactly 破坏代码。

df_turbine1、df_turbine0 的示例数据

        datetime    WindSp_max  WindSp_mean
218705  28/12/2017 18:40    15.4    10.39798
218706  28/12/2017 18:50    14.1    10.49598
218707  28/12/2017 19:00    13.01   9.025653
218708  28/12/2017 19:10    13.68   9.276702
218709  28/12/2017 19:20    14.02   9.125614
218710  28/12/2017 19:30    12.51   8.900918
218711  28/12/2017 19:40    12.76   9.177135
218712  28/12/2017 19:50    12.84   9.082051
218713  28/12/2017 20:00    12.17   8.60314

        datetime    WindSp_max  WindSp_mean
109120  28/12/2017 18:40    13.93   11.08517
109121  28/12/2017 18:50    13.77   10.16184
109122  28/12/2017 19:00    12.93   10.20069
109123  28/12/2017 19:10    14.19   10.64296
109124  28/12/2017 19:20    13.93   10.50484
109125  28/12/2017 19:30    13.77   10.60769
109126  28/12/2017 19:40    14.02   10.81324
109127  28/12/2017 19:50    14.35   10.45523
109128  28/12/2017 20:00    13.68   10.32253

对于这个时间步,print df_turbine0.isnull().sum()df_turbine0df_turbine1 中都不返回任何 nan 值。每个df 包含144 个非空值,df_pcorr1 是288 行。每当第 1 列中有值时,第 2 列中就有 nan,反之亦然

我假设因为 df_turbine0df_turbine1 是同一数据集的子集,它们携带来自原始 df 的索引,这可能会导致错误。

但是,将索引更改为日期时间或将其重置对pcorr1() 的计算或索引没有任何影响。

df_turbine0.set_index(['datetime'])

df_turbine0.reset_index()

【问题讨论】:

  • 我不确定我是否遵循。您运行df_pcorr1 = pd.concat([turbine1_windspeed, turbine0_windspeed], axis=1),它连接两个数据帧(或系列),在您的情况下可能都是长度为 1。你为什么把它比作对np.corrcoeff的调用?连接数据帧与计算相关系数不同。我错过了什么?
  • 非常好!您错过了它,因为我没有包含所有代码。现在编辑以包括我与np.corrcoeff()pcorr1 = df_pcorr1.corr()比较的行
  • 请在帖子正文中包含样本数据(不是image),并确保这样的样本足以reproducecorr 上的 NaN 问题。
  • 您的串联数据框是什么样的?例如,df_pcorr1 和朋友?这些应该足够短,以便在您的问题中完整列出。
  • (旁白:你的代码可能会更短,因为你实际上已经复制粘贴了四次相同的代码,而不是使用适当的循环。我提到它,因为它也会提出问题更清晰,也就是说,不会因大量重复代码而变得模糊。或者,只需从示例代码中删除 2 个涡轮机,以便您的左侧至少有一个好的(没有 NaN)和一组坏的连接数据帧。从技术上讲,我们没有甚至不需要turbine5= turbine_list[5]; df_turbine5 = df_24hour[df_24hour['StationName'].str.contains(turbine5)] 和朋友,只需df_turbine5 的值。)

标签: python python-2.7 numpy dataframe correlation


【解决方案1】:

这是一个索引错误。所有较小的df_turbine 都来自同一个原始数据框,并保留了索引。这已通过使用 inplace =True 重置索引来修复

df_turbine1.reset_index(drop = True, inplace=True)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-27
    • 1970-01-01
    • 2021-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-04
    相关资源
    最近更新 更多