Pandas, реплицировать каждую строку, имеющую более одного значения - PullRequest
0 голосов
/ 04 апреля 2020

У меня есть 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

возвращает точно такой же фрейм данных.

1 Ответ

1 голос
/ 04 апреля 2020

Я думаю repeat:

(df.loc[df.index.repeat(df.quantity)]
   .assign(quantity=1)
 )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...