数据框枢轴返回错误:索引包含重复的条目

时间:2019-05-05 10:09:53

标签: python pandas dataframe

初始数据框:

df

Comp    Time               Match    Odds    H          A    Res  
GER D2  13:00:00    Tem1 v Team2    op      2.07    3.66    2-3(1-0)    
GER D2  13:00:00    Tem1 v Team2    cl      2.41    3.02    2-3(1-0)    
GER D1  20:30:00    Tem3 v Team4    op      5.07    1.71    3-3(1-2)    
GER D1  20:30:00    Tem3 v Team4    cl      4.76    1.71    3-3(1-2)    
FRA D2  20:00:00    Tem5 v Team6    op      2.34    3.42    1-0(1-0)    
FRA D2  20:00:00    Tem5 v Team6    cl      2.08    3.99    1-0(1-0)    

我通过枢轴调整了形状,并且使用此代码效果很好

pf = df.pivot(index='Match', columns='Odds')#, values='Home Win')
pf.columns = ['_'.join(col).rstrip('_') for col in pf.columns.values]
pf.reset_index(inplace=True)
pf = pf[['Match', 'Comp_cl', 'Date_cl','H_op', 'H_cl', 'A_op',  'A_cl', 'Res_cl']]
pf = pf.rename(columns = {'Comp_cl':'Comp', 'Date_cl':'Date', 'Res_cl': 'Res' })

这是结果:

Comp    Time               Match    H_op    H_cl    A_op    A_cl    Res
GER D2  13:00:00    Tem1 v Team2    2.07    2.41    3.66    3.02    2-3(1-0)
GER D1  20:30:00    Tem3 v Team4    5.07    4.76    1.71    1.71    3-3(1-2)
FRA D2  20:00:00    Tem5 v Team6    2.34    2.08    3.42    3.99    1-0(1-0)

然后,当我添加更多数据并将date列添加到初始数据框中时,

df_extended

Comp    Time           Match       Odds    H     A       Res        Date
GER D2  13:00:00    Tem1 v Team2    op  2.07    3.66    2-3(1-0)    2019-05-04
GER D2  13:00:00    Tem1 v Team2    cl  2.35    3.05    2-3(1-0)    2019-05-04
GER D1  20:30:00    Tem3 v Team4    op  5.07    1.71    3-3(1-2)    2019-05-04
GER D1  20:30:00    Tem3 v Team4    cl  6.50    1.66    3-3(1-2)    2019-05-04
FRA D2  20:00:00    Tem5 v Team6    op  2.34    3.42    1-0(1-0)    2019-05-03
FRA D2  20:00:00    Tem5 v Team6    cl  1.80    8.06    1-0(1-0)    2019-05-03
JAP D2  10:00:00    Tem7 v Team8    op  10.23   1.21    0-0(0-0)    2019-05-03
JAP D2  10:00:00    Tem7 v Team8    cl  12.50   1.11    0-0(0-0)    2019-05-03
…   …   …       …   …   …   …
MEX D1  12:00:00    Team12 v Team13 op  2.10    2.05    1-0(1-0)    2019-05-05
MEX D1  12:00:00    Team12 v Team13 op  2.10    2.03    1-0(1-0)    2019-05-05
USA D1  20:00:00    Team1 v Team5   cl  1.78    2.60    5-2(3-0)    2019-05-05
USA D1  20:00:00    Team1 v Team5   cl  1.88    2.66    5-2(3-0)    2019-05-05
GER D2  20:00:00    Team20 v Team2  op  1.74    3.59    2-2(0-0)    2019-05-06
GER D2  20:00:00    Team20 v Team2  op  1.75    3.60    2-2(0-0)    2019-05-06
GER D1  20:00:00    Team1 v Team6   cl  1.30    3.42    1-0(1-0)    2019-05-06
GER D1  20:00:00    Team1 v Team6   cl  1.30    3.42    1-0(1-0)    2019-05-06

尝试做同样的事情(调整它的形状),并应用相同的代码,但是我遇到了错误

ValueError: Index contains duplicate entries, cannot reshape

我已经在堆栈中检查了所有类似问题的答案,我尝试了每种解决方案,但没有一个能解决问题

2 个答案:

答案 0 :(得分:1)

基本上是索引问题。因此,根据您的需要,您可以使用pivot_table,因为pivot不接受列表索引,而pivot_table接受。

以下是您可能会发现有用的内容:

#add more columns in the index if you need 
pf = df.pivot_table(index=['Match', 'Comp', 'Time', 'Res'], columns='Odds')
pf['date'] = "2019-05-06"
pf.columns = ['_'.join(col).rstrip('_') for col in pf.columns.values]
print(pf)

然后我得到了

                                       A_cl  A_op  H_cl  H_op        date
Match        Comp   Time     Res                                         
Tem1 v Team2 GER D2 13:00:00 2-3(1-0)  3.02  3.66  2.41  2.07  2019-05-06
Tem3 v Team4 GER D1 20:30:00 3-3(1-2)  1.71  1.71  4.76  5.07  2019-05-06
Tem5 v Team6 FRA D2 20:00:00 1-0(1-0)  3.99  3.42  2.08  2.34  2019-05-06

答案 1 :(得分:1)

您的代码可能失败,因为 pivot 不允许源数据 在 index 指定的列中具有重复值 参数。

也许可以规避此限制的方法是:

  • 将您的DataFrame分组为连续的行对(数据用于 赔率 == op cl 都相同)。
  • 将函数应用于上述每个组。

因此,您应该定义一个要应用为的函数:

def fn(src):
    wrk = pd.Series(src.H.append(src.A, ignore_index=True))
    wrk.index=['H_op', 'H_cl', 'A_op', 'A_cl']
    row0 = src.iloc[0]
    return pd.concat([row0[['Comp', 'Time', 'Match']], wrk, row0[['Res']]])

请注意此功能:

  • 通过连接 H A 列创建作品系列, 删除现有索引并设置适当的索引 (然后将是结果中的列名)。
  • 从中获取所有其他值( Comp Time Match Res ) 第一行。
  • 以正确的源值顺序返回系列

然后唯一要做的就是将此功能应用于每对来源 行:

df.groupby(np.arange( len(df.index)) // 2).apply(fn)