Разделение строк df pandas на определенный делитель
Подскажите как можно разделить строки на кратное количество. Из такого
A B C
0 a b 16 # Делитель 2
1 a c 22 # Делитель 3
2 b d 12 # Делитель 5
Получить такой
A B C
0 a b 2
0 a b 2
0 a b 2
0 a b 2
0 a b 2
0 a b 2
0 a b 2
0 a b 2
1 a c 3
1 a c 3
1 a c 3
1 a c 3
1 a c 3
1 a c 3
1 a c 3
1 a c 1
2 b d 5
2 b d 5
2 b d 1
2 b d 1
Есть такое решение, где один общий делитель, не знаю как сделать по условию
df = pd.DataFrame(dict(A=['a', 'a', 'b'], B=['b', 'c', 'd'], C=[16, 22, 12]))
m = np.array([4, 1])
dm = list(zip(*np.divmod(df.C.values, m[0])))
rep = [sum(x) for x in dm]
new = np.concatenate([m.repeat(x) for x in dm])
df.loc[df.index.repeat(rep)].assign(C=new)
Но мне нужно, чтобы по столбцу В использовать разные делители, значения в словаре
d = {'b' : 2, 'c' : 3, 'd' : 5}
Ответы (2 шт):
Автор решения: Алексей Р
→ Ссылка
Вариант с apply и lambda функцией, в которую передается Series (очередная строка фрейма) и словарь. Размножение строк реализовано с помощью explode(). Плюс вспомогательные преобразования.
d = {'b': 2, 'c': 3, 'd': 5}
df = pd.DataFrame(dict(A=['a', 'a', 'b'], B=['b', 'c', 'd'], C=[16, 22, 12]))
df.C = df.apply(lambda x: [d[x.B]] * (x.C // d[x.B]) + [1] * (x.C % d[x.B]), axis=1)
df = df.explode('C')
print(df)
A B C
0 a b 2
0 a b 2
0 a b 2
0 a b 2
0 a b 2
0 a b 2
0 a b 2
0 a b 2
1 a c 3
1 a c 3
1 a c 3
1 a c 3
1 a c 3
1 a c 3
1 a c 3
1 a c 1
2 b d 5
2 b d 5
2 b d 1
2 b d 1
Автор решения: strawdog
→ Ссылка
df["C"] = df.apply(lambda x: np.divmod(x["C"], d.get(x["B"])), axis=1)
df["C"] = df.apply(lambda x: np.concatenate((np.full(x["C"][0], d.get(x["B"])),
(np.full(x["C"][1], 1)))), axis=1)
df = df.explode("C")
df:
A B C
0 a b 2
0 a b 2
0 a b 2
0 a b 2
0 a b 2
0 a b 2
0 a b 2
0 a b 2
1 a c 3
1 a c 3
1 a c 3
1 a c 3
1 a c 3
1 a c 3
1 a c 3
1 a c 1
2 b d 5
2 b d 5
2 b d 1
2 b d 1