Группировка данных с использованием Python

1

Мой информационный кадр:

  ordercode             quantity
PMC21-AA1U1FBWBJA           1
PMP23-GR1M1FB3CJ            1
PMC11-AA1U1FJWWJA           1
PMC11-AA1U1FBWWJA+I7        2
PMC11-AA1U1FJWWJA           3
PMC11-AA1L1FJWWJA           3

Мой желаемый результат:

  Group    ordercode                quantity
    0       PMC21-AA1U1FBWBJA           1
            PMP23-GR1M1FB3CJ            1
             PMC11-AA1U1FJWWJA          1
            PMC11-AA1U1FBWWJA+I7        1
    1      PMC11-AA1U1FBWWJA+I7         1
            PMC11-AA1U1FJWWJA           3
    2      PMC11-AA1L1FJWWJA            3

Итак, мой желаемый результат основан на column['quantity']. Максимальное значение - 4.

В group0 & group1 группе 1 общие значения (1 + 1 + 1 + 1 = 4) (1 + 3 = 4) (т.е. Сохраняя максимальную шкалу количества как 4). В group2 мы видим, что никакие значения не добавляются, поэтому группа образуется слева (здесь она равна 3). В group0 & group1 мы видим, что значение PMC11-AA1U1FBWWJA+I7 разделяется.

Я получил небольшую помощь от форума и сделал следующую кодировку:

df = pd.DataFrame(np.concatenate(df.apply(lambda x: [x[0]] * x[1], 1).as_matrix()), 
              columns=['ordercode'])
df['quantity'] = 1
df['group'] = sorted(range(0, len(df)/3, 1) * 4)[0:len(df)]
df.groupby(['group', 'ordercode']).sum()

но я получаю ошибку.

Type error: 'float' object cannot be interpreted as an integer

Если я использую int в

df['group'] = sorted(range(0, int(len(df)/3), 1) * 4)[0:len(df)]

опять я получаю typeerror. Может ли кто-нибудь сказать мне, почему?

Теги:
pandas
dataframe
python-3.x

1 ответ

2
Лучший ответ

Предполагая, что вы используете Python3, введите двойную косую черту // чтобы сделать целочисленное деление и преобразовать диапазон в список.

df['group'] = sorted(list(range(0, len(df) // 3, 1)) * 4)[0:len(df)]

Для второй попытки это выглядит так.

df['group'] = sorted(list(range(0, int(len(df) / 3), 1)) * 4)[0:len(df)]

Таким образом, полный код работает следующим образом. Перед запуском я скопировал ваш пример в буфер обмена.

import pandas as pd
import numpy as np
df = pd.read_clipboard()
df = pd.DataFrame(np.concatenate(df.apply(lambda x: [x[0]] * x[1], 1).as_matrix()), 
              columns=['ordercode'])
df['quantity'] = 1
df['group'] = sorted(list(range(0, len(df) // 3, 1)) * 4)[0:len(df)]
df = df.groupby(['group', 'ordercode']).sum()
print(df)

Используемая вами команда ".as_matrix()" генерирует предупреждение, но работает.

  • 0
    Да, я использую Python 3. Я получаю Typeerror: unsupported operand type(s) for *:'range' and 'int'
  • 0
    Я обновил ответ. В первой строке была проблема с брекетами.
Показать ещё 13 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню