Проверить список элементов только по следующей строке NaN - PullRequest
0 голосов
/ 03 мая 2020

У меня есть следующий DataFrame:

            Item  Weight  Bags                 Must  quantity  must quantity  bags str len   assigned bag
0     planes bag    8.50  planes,pods          True     1              1          6                NaN
1  Full Bandolera   3.76  planes               True     1              2          6                NaN
2  tail             0.30  planes               False    3              2          6                NaN
3  central wing     1.08  planes               False    3              2          6                NaN
4  engine           0.44  planes               False    3              2          6                NaN
5  height steer     0.12  planes,pods          False    3              2          6                NaN
6  dihedral         0.40  planes               False    3              2          6                NaN   
7  pods bag         8.72  pods,ground sys...   True     1              1          4                NaN
8  Pod              1.74  pods                 True     3              2          4                NaN
9  optic            0.86  pods                 True     2              2          4                NaN
10 thermal          1.20  ground system bag    True     3              2          4                NaN

Я хочу заполнить столбец назначенной сумки именем сумки, если эта сумка находится в столбце Сумки.

Но я хочу только заполните назначенную сумку следующей пустой строки, потому что с каждым назначенным элементом мне нужно проверить некоторые другие условия.

До сих пор я пробовал следующее:

BAGS_NAMES = ['planes bag', 'pods bag', 'ground system bag', 'low bag', 'mefaked low']

    @classmethod
    def assign_items_to_bags(cls):
     cls.df[DfConsts.ASSIGNED_BAG] = [bag in BAGS_NAMES for bag in cls.df[DfConsts.BAGS].values.tolist()]
        return cls.df

или это:

    @classmethod
    def assign_items_to_bags(cls):
        cls.df[DfConsts.ASSIGNED_BAG] = cls.df[cls.df[DfConsts.BAGS].isin(BAGS_NAMES)]
        return cls.df

это тоже, что создает другую проблему, потому что это не меняет сделанный выбор.

    @classmethod
    def assign_items_to_bags(cls):
        try:
            selected_bag = random.choice(BAGS_NAMES)
            cls.df[DfConsts.ASSIGNED_BAG] = cls.df.loc[
                                                cls.df[DfConsts.BAGS].str.contains(
                                                    selected_bag)] == selected_bag

Мне нужно что-то подобное.

    @classmethod
    def assign_items_to_bags(cls):
        for item in BAGS_NAMES:
            # how to check only the first NaN row?
            if cls.df[DfConsts.BAGS].str.contains(item):
                cls.df[DfConsts.ASSIGNED_BAG] = item
            # try next item in BAGS_NAMES

1 Ответ

1 голос
/ 03 мая 2020

Я считаю, что вам нужно:

@classmethod
def assign_items_to_bags(cls):
    for item in BAGS_NAMES:
        # how to check only the first NaN row?
        mask = cls.df[DfConsts.BAGS].str.contains(item)
        cls.df.loc[mask, DfConsts.ASSIGNED_BAG] = item

Или:

@classmethod
def assign_items_to_bags(cls):
    for item in BAGS_NAMES:
        # how to check only the first NaN row?
        mask = DfConsts['BAGS'].str.contains(item)
        DfConsts.loc[mask, 'ASSIGNED_BAG'] = item
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...