首页 > 解决方案 > 使用 linregress 的参数中使用的查询迭代分组

问题描述

我已按“过滤器”列对名为“full_df2”的数据框进行了分组。然后我将不同的“过滤器”组名放在一个名为“unique_list”的列表中。我想使用以下代码遍历我的数据框,以便我可以获得每个分组的图。'Rating' 和 'hhs' 是我将运行回归的数据框中的列。

当我运行下面的代码时,我得到了这个错误。ValueError: too many values to unpack (expected 4) 我尝试在第 2 行末尾添加 .split(',') ,但没有帮助。我一直在冲浪板试图克服这个错误。我是 Python 新手。因此,任何帮助和解释将不胜感激。

这是一些示例数据和我使用的真实代码。

    full_df2 = np.array([['Letter', 'Sync', 'Status', 'filter', 'Rating', 'hhs'],
                ['A', 'And', 'Off', 'A And Off', .4, 300],
                ['A', 'And', 'On', 'A And On', .5, 300]
                ['A', 'Or', 'Off', 'A Or Off', .7, 300]
                ['A', 'Or', 'On', 'A Or On', .3, 300]
                ['A', 'Between', 'Off', 'A Between Off', .6, 300]
                ['A', 'Between', 'On', 'A Between On', .4, 300]
                ['A', 'And', 'Off', 'A And Off', .6, 400],
                ['A', 'And', 'On', 'A And On', .4, 400]
                ['A', 'Or', 'Off', 'A Or Off', .3, 400]
                ['A', 'Or', 'On', 'A Or On', .4, 400]
                ['A', 'Between', 'Off', 'A Between Off', .3, 400]
                ['A', 'Between', 'On', 'A Between On', .8, 400]
                ['A', 'And', 'Off', 'A And Off', .4, 250],
                ['A', 'And', 'On', 'A And On', .5, 250]
                ['A', 'Or', 'Off', 'A Or Off', .7, 250]
                ['A', 'Or', 'On', 'A Or On', .3, 250]
                ['A', 'Between', 'Off', 'A Between Off', .6, 250]
                ['A', 'Between', 'On', 'A Between On', .4, 250]
                ])

    unique_df = dict(tuple(full_df2.groupby(['Letter', 'Sync', 'Status', 'filter'])))
    unique_list = ([x[-1] for x in unique_df])
    for x in unique_list:
       print (x)


for p in unique_list:
  slope, intercept, r_value, p_value, std_err = stats.linregress(full_df2.query("filter == @p")[['rating']], full_df2.query("filter == @p")[['hhs']])
  filter_df = full_df2.query("filter == @p")
  ax = sns.regplot(x="rating", y="hhs", data=filter_df, color='b', 
  line_kws={'label':"y={0:.1f}x+{1:.1f}".format(slope,intercept)})
  ax.legend()
  ax.set_title(p)
  plt.show() 
  print(slope)

这是完整的错误:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-29-75511dada630> in <module>()
      1 for p in unique_list:
----> 2     slope, intercept, r_value, p_value, std_err = stats.linregress(full_df2.query("filter == @p")[['rating']], full_df2.query("filter == @p")[['hhs']])
      3     #result = [stats.linregress(data[key]['num'],data[key]['com']) for key in keys]
      4     #slope, intercept, r_value, p_value, std_err =
      5     #.split(',')

~\AppData\Local\Continuum\anaconda3\lib\site-packages\scipy\stats\_stats_mstats_common.py in linregress(x, y)
     91 
     92     # average sum of squares:
---> 93     ssxm, ssxym, ssyxm, ssym = np.cov(x, y, bias=1).flat
     94     r_num = ssxym
     95     r_den = np.sqrt(ssxm * ssym)

ValueError: too many values to unpack (expected 4)

标签: pythonpandasscikit-learn

解决方案


根据我们上面的评论,您遇到的问题是输入的形状。使其工作的最简单方法是将输入更改为linregress

stats.linregress(full_df2.query("filter == @p")['rating'], full_df2.query("filter == @p")['hhs'])

我个人会用以下方式编写它:

stats.linregress(full_df2.loc[full_df2.filter == p, 'rating'], full_df2.loc[full_df2.filter == p, 'hhs'])

推荐阅读