Мой информационный кадр:
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
. Может ли кто-нибудь сказать мне, почему?
Предполагая, что вы используете 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()" генерирует предупреждение, но работает.
Typeerror: unsupported operand type(s) for *:'range' and 'int'