Pandas, Фильтр не None значений и против списка нескольких значений - PullRequest
0 голосов
/ 02 апреля 2020

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

            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
11 Encryption Cable 0.20  Ground  <NA>    1              0          25                None
                          System,
                          planes, 
                          pods, 
                          low bag  

Я пытаюсь присвоить значение столбца Bags сумке с назначенной длиной при следующем условии: если значение столбца Must не равно NULL и длина столбец сумки соответствует одному из пунктов в следующем списке:

[6,4,13]

Это моя попытка:

class AssignBagMusts:
    df = ITEMS_DF
    _bags: dict = BAGS

    @classmethod
    def create_bag_df(cls):
        """
        Add len of string in Bags column to a column named beg_len.
        """
        cls.df['bags column length'] = cls.df['Bags'].map(len)
        cls.df['assigned bag'] = None
        return cls.df

    @classmethod
    def assign_to_bag(cls):
        bags_lens = list(cls._bags.values())
        df = cls.df[pd.notnull(cls.df[cls.df['Must']]) &
                    cls.df[cls.df['bags column length']] == any(bags_lens)]
        print(df)
if __name__ == '__main__':
    AssignBagMusts.create_bag_df()
    AssignBagMusts.assign_to_bag()

И я получил эту ошибку:

raise KeyError(f"None of [{key}] are in the [{axis_name}]")
KeyError: "None of [Index([ 'v',  'v', <NA>, <NA>, <NA>, <NA>, <NA>,  'v',  'v',  'v',  'v',  'v',\n        'v',  'v',  'v',  'v',  'v',  'v', <NA>,  'v', <NA>,  'v',  'v',  'v',\n        'v',  'v',  'v', <NA>, <NA>,  'v', <NA>,  'v', <NA>, <NA>, <NA>, <NA>,\n        'v', <NA>, <NA>,  'v',  'v',  'v',  'v',  'v'],\n      dtype='object')] are in the [columns]"

1 Ответ

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

Вы должны изменить эту строку

cls.df[cls.df['bags column length']] == any(bags_lens)]

на эту

(cls.df['bags column length'] == any(bags_lens)])

Вот мой df enter image description here

import pandas as pd
df = pd.read_clipboard()
bags_lens = [6,4,13]
df[(pd.notnull(df['Must'])) &(df['bags'] == any(bags_lens))]

печать (df)

 Item  Weight Bags  Must quantity must  quantity.1  bags column length  
0    0  planes  bag  8.50   planes    v         1.0   1.0      6   None   
7    7    pods  bag  8.72     pods    v         1.0   1.0      4   None 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...