Ошибка возврата сводной таблицы данных: индекс содержит повторяющиеся записи - PullRequest
0 голосов
/ 05 мая 2019

Исходный кадр данных:

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)    

Я изменяю его с помощью pivot, и он хорошо работает с использованием этого кода

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)

Затем, когда я добавил дополнительные данные и добавил столбец даты к исходному фрейму данных,

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 ]

1 голос
/ 05 мая 2019

Возможно, ваш код не выполнен, поскольку 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 , Время , Совпадение и Res ) из первой строки.
  • Возвращает Series с правильным порядком источника values.

Тогда единственное, что нужно сделать, это применить эту функцию к каждой паре исходных строк:

df.groupby(np.arange( len(df.index)) // 2).apply(fn)
1 голос
/ 05 мая 2019

Это проблема индексации в принципе. Поэтому в зависимости от того, что вам нужно, вы можете использовать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...