代码之家  ›  专栏  ›  技术社区  ›  elPastor

熊猫经常回楠

  •  2
  • elPastor  · 技术社区  · 7 年前

    我试图在一个数据帧上运行一个我认为应该是简单的相关函数,但是在我认为不应该的地方它返回NaN。

    代码:

    # setup
    import pandas as pd
    import io
    
    csv = io.StringIO(u'''
    id  date    num
    A   2018-08-01  99
    A   2018-08-02  50
    A   2018-08-03  100
    A   2018-08-04  100
    A   2018-08-05  100
    B   2018-07-31  500
    B   2018-08-01  100
    B   2018-08-02  100
    B   2018-08-03  0
    B   2018-08-05  100
    B   2018-08-06  500
    B   2018-08-07  500
    B   2018-08-08  100
    C   2018-08-01  100
    C   2018-08-02  50
    C   2018-08-03  100
    C   2018-08-06  300
    ''')
    
    df = pd.read_csv(csv, sep = '\t')
    
    # Format manipulation
    df = df[df['num'] > 50]
    df = df.pivot(index = 'date', columns = 'id', values = 'num')
    df = pd.DataFrame(df.to_records())
    
    # Main correlation calculations
    print df.iloc[:, 1:].corr()
    

           A      B      C
    0    NaN  500.0    NaN
    1   99.0  100.0  100.0
    2    NaN  100.0    NaN
    3  100.0    NaN  100.0
    4  100.0    NaN    NaN
    5  100.0  100.0    NaN
    6    NaN  500.0  300.0
    7    NaN  500.0    NaN
    8    NaN  100.0    NaN
    

    corr()结果:

        A    B    C
    A  1.0  NaN  NaN
    B  NaN  1.0  1.0
    C  NaN  1.0  1.0
    

    根据(有限的) documentation

    有很好的讨论 here here ,但都没有回答我的问题。我试过了 float64 讨论的想法 here ,但也失败了。

    @hellpanderr的评论提出了一个很好的观点,我使用的是0.22.0

    1 回复  |  直到 7 年前
        1
  •  10
  •   Cleb    7 年前

    结果似乎是你处理的数据的伪制品。当你写的时候, NA s被忽略了,所以基本上可以归结为:

    df[['B', 'C']].dropna()
    
           B      C
    1  100.0  100.0
    6  500.0  300.0
    

    因此,每列只剩下两个值用于计算,因此 lead to to correlation coefficients of 1

    df[['B', 'C']].dropna().corr()
    
         B    C
    B  1.0  1.0
    C  1.0  1.0
    

    那么,你在哪里 不适用 那么剩下的组合是什么呢?

    df[['A', 'B']].dropna()
    
           A      B
    1   99.0  100.0
    5  100.0  100.0
    
    
    df[['A', 'C']].dropna()
    
           A      C
    1   99.0  100.0
    3  100.0  100.0
    

    所以,在这里,每列只有两个值。不同的是列 B C 100 0 :

    df[['A', 'C']].dropna().std()
    
    A    0.707107
    C    0.000000
    

    .