Разархивируйте фрейм данных с дублированным индексом в Pandas - PullRequest
0 голосов
/ 05 августа 2020

Учитывая следующий набор данных игрушек, в котором дублируются price и quantity:

  city      item value
0   bj     price    12
1   bj  quantity    15
2   bj     price    12
3   bj  quantity    15
4   bj     level     a
5   sh     price    45
6   sh  quantity    13
7   sh     price    56
8   sh  quantity     7
9   sh     level     b

, я хочу преобразовать его в следующий фрейм данных, что означает добавить sell_ для первой пары и buy_ для второй пары:

  city  sell_price  sell_quantity  buy_price  buy_quantity level
0   bj          12             15         13            16     a
1   sh          45             13         56             7     b

Я пробовал с df.set_index(['city', 'item']).unstack().reset_index(), но возникает ошибка: ValueError: Index contains duplicate entries, cannot reshape.

Как я могу получить желаемый результат, как указано выше ? Спасибо.

1 Ответ

3 голосов
/ 05 августа 2020

Вы можете добавить для вторых повторяющихся значений buy_ и для первых дубликатов sell_ и изменить значения в item перед вашим решением:

m1 = df.duplicated(['city', 'item'])
m2 = df.duplicated(['city', 'item'], keep=False)

df['item'] = np.where(m1, 'buy_', np.where(m2, 'sell_', '')) + df['item']

df = (df.set_index(['city', 'item'])['value']
        .unstack()
        .reset_index()
        .rename_axis(None, axis=1))

#for change order of columns names
df = df[['city','sell_price','sell_quantity','buy_price','buy_quantity','level']]
print (df)
  city sell_price sell_quantity buy_price buy_quantity level
0   bj         12            15        12           15     a
1   sh         45            13        56            7     b
...