У меня есть pandas фрейм данных.
Я хочу реплицировать каждую строку во фрейме данных, которая в столбце «количество» имеет более одного, и изменить значение этой строки на -1 для каждого созданного, пока не достигнет единицы.
Item Weight Bags Must quantity must quantity bags column length assigned bag
0 planes bag 8.50 planes v 1 1 6 None
1 Full Bandolera 3.76 planes v 3 2 6 None
2 tail 0.30 planes <NA> 3 2 6 None
3 central wing 1.08 planes <NA> 3 2 6 None
4 engine 0.44 planes <NA> 3 2 6 None
5 height steer 0.12 planes <NA> 3 2 6 None
6 dihedral 0.40 planes <NA> 3 2 6 None
7 pods bag 8.72 pods v 1 1 4 None
8 Pod 1.74 pods v 3 2 4 None
9 optic 0.86 pods v 2 2 4 None
10 thermal 1.20 pods v 3 2 4 None
Так, например, количество строк Полного Бандолера станет равным 1, и будет два его дубликата.
Item Weight Bags Must quantity must quantity bags column length assigned bag
0 planes bag 8.50 planes v 1 1 6 None
1 Full Bandolera 3.76 planes v 1 2 6 None
2 Full Bandolera 3.76 planes v 1 2 6 None
3 Full Bandolera 3.76 planes v 1 2 6 None
4 tail 0.30 planes <NA> 3 2 6 None
5 central wing 1.08 planes <NA> 3 2 6 None
6 engine 0.44 planes <NA> 3 2 6 None
7 height steer 0.12 planes <NA> 3 2 6 None
8 dihedral 0.40 planes <NA> 3 2 6 None
9 pods bag 8.72 pods v 1 1 4 None
10 Pod 1.74 pods v 3 2 4 None
11 optic 0.86 pods v 2 2 4 None
12 thermal 1.20 pods v 3 2 4 None
Пока у меня есть этот код:
def multiply_row(cls):
print(cls.df.dtypes)
for row in cls.df.iterrows():
while row['quantity'] > 1:
row_to_list = list(row)
listed_row = row_to_list.copy()
add_to_df = tuple(listed_row)
cls.df.append(add_to_df)
row['quantity'] = row['quantity'] - 1
return cls.df
вывод:
while row['quantity'] > 1:
TypeError: tuple indices must be integers or slices, not str
Item string
Weight float64
Bags string
Must object
quantity int64
must quantity int64
category object
bags column length int64
assigned bag object
assigned_bag object
Я очень не уверен в методе, который я написал, я очень плохо знаком с pandas.
ОБНОВЛЕНИЕ:
с использованием ответа Куанг Хоанг, никаких ошибок не возникает.
Тем не менее, фрейм данных остается прежним.
def multiply_row():
for idx, row in df.iterrows():
while row['quantity'] > 1:
(df.loc[df.index.repeat(df.quantity)]
.assign(quantity=1))
return df
возвращает точно такой же фрейм данных.