Нахождение значения в фрейме(или столбце) и при его нахождении добавить дополнительные строки
Есть DataFrame:
import pandas as pd
lst = {'Name':['car1', 'car2', 'car3', 'car4'], 'Type':[20, 21, 19, 18], 'Repair':["n", "n", "y", "n"]}
df = pd.DataFrame(lst)
print(df)
Нужно при нахождении значения y в нужном столбце добавить еще некоторое кол-во строк (i) с суффиксом _Bit {i}, но другие столбцы не изменять как в примере. Где i меняется в диапазоне от 0 до 16.
import pandas as pd
lst = {'Name':['car1', 'car2', 'car3','car3','car3','car3', 'car4'], 'Type':[20, 21, 19,19,19,19, 18], 'Repair':["n", "n", "y","y_bit0","y_bit1","y_bit2", "n"]}
df = pd.DataFrame(lst)
print(df)
Ответы (1 шт):
Автор решения: MaxU
→ Ссылка
Пример:
Исходный DF:
In [85]: df
Out[85]:
Name Type Repair
0 car1 20 y
1 car2 21 n
2 car3 19 y
3 car4 18 n
создаем вспомогательный DF:
N = 3
t = pd.concat([df.query("Repair == 'y'")] * N, ignore_index=True).sort_values("Name")
In [87]: t
Out[87]:
Name Type Repair
0 car1 20 y
2 car1 20 y
4 car1 20 y
1 car3 19 y
3 car3 19 y
5 car3 19 y
изменяем значения в столбце "Repair":
In [88]: t["Repair"] += "_bit" + t.groupby("Name")["Repair"].cumcount().astype(str)
In [89]: t
Out[89]:
Name Type Repair
0 car1 20 y_bit0
2 car1 20 y_bit1
4 car1 20 y_bit2
1 car3 19 y_bit0
3 car3 19 y_bit1
5 car3 19 y_bit2
объединем исходный DF с вспомогательным:
In [90]: res = pd.concat([df, t], ignore_index=True).sort_values(["Name", "Repair"])
In [91]: res
Out[91]:
Name Type Repair
0 car1 20 y
4 car1 20 y_bit0
5 car1 20 y_bit1
6 car1 20 y_bit2
1 car2 21 n
2 car3 19 y
7 car3 19 y_bit0
8 car3 19 y_bit1
9 car3 19 y_bit2
3 car4 18 n