初始数据框:
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
我已经在堆栈中检查了所有类似问题的答案,我尝试了每种解决方案,但没有一个能解决问题
答案 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 和列指定的列中具有重复值 参数。
也许可以规避此限制的方法是:
因此,您应该定义一个要应用为的函数:
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']]])
请注意此功能:
然后唯一要做的就是将此功能应用于每对来源 行:
df.groupby(np.arange( len(df.index)) // 2).apply(fn)