【问题标题】:Pandas Series correlation against a single vectorPandas Series 与单个向量的相关性
【发布时间】:2018-05-09 03:24:46
【问题描述】:

我有一个 DataFrame,其中一列是数组列表。

  import pandas as pd

  v = [1, 2, 3, 4, 5, 6, 7]
  v1 = [1, 0, 0, 0, 0, 0, 0]
  v2 = [0, 1, 0, 0, 1, 0, 0]
  v3 = [1, 1, 0, 0, 0, 0, 1]

  df = pd.DataFrame({'A': [v1, v2, v3]})

  print df

输出:

                       A
0  [1, 0, 0, 0, 0, 0, 0]
1  [0, 1, 0, 0, 1, 0, 0]
2  [1, 1, 0, 0, 0, 0, 1]

我想针对单个向量 v 为 df.A 的每一行做一个 pd.Series.corr。 我目前正在 df.A 上循环并实现它。速度很慢。

预期输出:

                       A         B
0  [1, 0, 0, 0, 0, 0, 0]  -0.612372 
1  [0, 1, 0, 0, 1, 0, 0]  -0.158114
2  [1, 1, 0, 0, 0, 0, 1]  -0.288675 

【问题讨论】:

    标签: performance pandas numpy dataframe


    【解决方案1】:

    这是一个使用 NumPy 工具的相关定义,旨在提高 corr2_coeff_rowwise 的性能 -

    a = np.array(df.A.tolist()) # or np.vstack(df.A.values)
    df['B'] = corr2_coeff_rowwise(a, np.asarray(v)[None])
    

    运行时测试-

    案例 #1:1000 行

    In [59]: df = pd.DataFrame({'A': [np.random.randint(0,9,(7)) for i in range(1000)]})
    
    In [60]: v = np.random.randint(0,9,(7)).tolist()
    
    # @jezrael's soln
    In [61]: %timeit df['new'] = pd.DataFrame(df['A'].values.tolist()).corrwith(pd.Series(v), axis=1)
    10 loops, best of 3: 142 ms per loop
    
    In [62]: %timeit df['B'] = corr2_coeff_rowwise(np.array(df.A.tolist()), np.asarray(v)[None])
    1000 loops, best of 3: 461 µs per loop
    

    案例 #2:10000 行

    In [63]: df = pd.DataFrame({'A': [np.random.randint(0,9,(7)) for i in range(10000)]})
    
    In [64]: v = np.random.randint(0,9,(7)).tolist()
    
    # @jezrael's soln
    In [65]: %timeit df['new'] = pd.DataFrame(df['A'].values.tolist()).corrwith(pd.Series(v), axis=1)
    1 loop, best of 3: 1.38 s per loop
    
    In [66]: %timeit df['B'] = corr2_coeff_rowwise(np.array(df.A.tolist()), np.asarray(v)[None])
    100 loops, best of 3: 3.05 ms per loop
    

    【讨论】:

    • np.array(df.A.tolist()) 可能更快。
    • @cᴏʟᴅsᴘᴇᴇᴅ 看起来更快!谢谢。
    • 请开始回答更多熊猫问题...
    【解决方案2】:

    使用corrwith,但如果性能很重要,Divakar's anwer 应该更快:

    df['new'] = pd.DataFrame(df['A'].values.tolist()).corrwith(pd.Series(v), axis=1)
    print (df)
                           A       new
    0  [1, 0, 0, 0, 0, 0, 0] -0.612372
    1  [0, 1, 0, 0, 1, 0, 0] -0.158114
    2  [1, 1, 0, 0, 0, 0, 1] -0.288675
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-18
      • 2015-08-12
      • 2021-07-09
      • 1970-01-01
      • 1970-01-01
      • 2017-06-01
      • 2012-12-29
      相关资源
      最近更新 更多