Создайте несколько столбцов в панде в фрейме данных за одно обновление - PullRequest
0 голосов
/ 17 сентября 2018

У меня есть датафрейм, как показано ниже:

df = pd.DataFrame({'Group': ['Fruit', 'Vegetable', 'Fruit', 'Vegetable', 'Fruit', 'Vegetable', 'Vegetable'],
                       'NId': ['Banana', 'Onion', 'Grapes', 'Potato', 'Apple', np.nan, np.nan],
                       'BName': [np.nan, 'GTwo', np.nan, 'GSix', np.nan, 'GOne', 'GNine'],
                       'BId': [np.nan, '5252', np.nan, '5678', np.nan, '5125', '5923']})
df['BId'] = df['BId'].astype(str)
df = df[['Group', 'NId', 'BName', 'BId']]

Что такое фрейм данных, как показано ниже:

       Group     NId  BName   BId
0      Fruit  Banana    NaN   nan
1  Vegetable   Onion   GTwo  5252
2      Fruit  Grapes    NaN   nan
3  Vegetable  Potato   GSix  5678
4      Fruit   Apple    NaN   nan
5  Vegetable     NaN   GOne  5125
6  Vegetable     NaN  GNine  5923

А затем я делаю операции ниже для создания новых столбцов, как показано ниже:

df.loc[df['NId'].notna(), 'Cat'] = df[df['NId'].notna()].apply(lambda x: 'NId', axis=1)
df.loc[df['NId'].isna(), 'Cat'] = df[df['NId'].isna()].apply(lambda x: 'GId', axis=1)

df.loc[df['NId'].notna(), 'Id'] = df[df['NId'].notna()].apply(lambda x: str(x['NId']), axis=1)
df.loc[df['NId'].isna(), 'Id'] = df[df['NId'].isna()].apply(lambda x: x['BName'], axis=1)

df.loc[df['NId'].notna(), 'IdQ'] = df[df['NId'].notna()].apply(lambda x: 'NId:' + str(x['NId']), axis=1)
df.loc[df['NId'].isna(), 'IdQ'] = df[df['NId'].isna()].apply(lambda x: 'BId:' + x['BId'], axis=1)

Который создал следующий выходной кадр данных:

       Group     NId  BName   BId  Cat      Id         IdQ
0      Fruit  Banana    NaN   nan  NId  Banana  NId:Banana
1  Vegetable   Onion   GTwo  5252  NId   Onion   NId:Onion
2      Fruit  Grapes    NaN   nan  NId  Grapes  NId:Grapes
3  Vegetable  Potato   GSix  5678  NId  Potato  NId:Potato
4      Fruit   Apple    NaN   nan  NId   Apple   NId:Apple
5  Vegetable     NaN   GOne  5125  BId    GOne    BId:5125
6  Vegetable     NaN  GNine  5923  BId   GNine    BId:5923

Я хотел знать, есть ли способ объединить эти операции или есть лучший подход для того же. В основном то, что я делаю, это Id is NId, если не NaN, иначе BName. Cat является NId, если обновляется из NId else BId. А столбец IdQ представляет собой комбинацию «NId» + NId или «BId» + BId в зависимости от логики, закодированной выше.

Ответы [ 2 ]

0 голосов
/ 17 сентября 2018

Вы можете использовать функцию назначения панд, чтобы назначить несколько столбцов одновременно

df1 = df[df['NId'].notna()].assign(Cat = lambda x: 'NId', Id = lambda x: df.NId, IdQ = lambda x: 'NId:' + df['NId'])
df1.append(df[df['NId'].isna()].assign(Cat = lambda x: 'GId', Id = lambda x: df.BName, IdQ = lambda x: 'BId:' + df['BId']))

    Group     NId    BName  BId   Cat   Id      IdQ
0   Fruit     Banana NaN    nan   NId   Banana  NId:Banana
1   Vegetable Onion  GTwo   5252  NId   Onion   NId:Onion
2   Fruit     Grapes NaN    nan   NId   Grapes  NId:Grapes
3   Vegetable Potato GSix   5678  NId   Potato  NId:Potato
4   Fruit     Apple  NaN    nan   NId   Apple   NId:Apple
5   Vegetable NaN    GOne   5125  GId   GOne    BId:5125
6   Vegetable NaN    GNine  5923  GId   GNine   BId:5923
0 голосов
/ 17 сентября 2018

Использование numpy.where:

mask = df['NId'].notna()
df['Cat'] = np.where(mask, 'NId','GId')
df['Id']  = np.where(mask, df['NId'].astype(str), df['BName'])
df['IdQ'] = np.where(mask, 'NId:' +  df['NId'].astype(str), 'BId:' + df['BId'])
print (df)
       Group     NId  BName   BId  Cat      Id         IdQ
0      Fruit  Banana    NaN   nan  NId  Banana  NId:Banana
1  Vegetable   Onion   GTwo  5252  NId   Onion   NId:Onion
2      Fruit  Grapes    NaN   nan  NId  Grapes  NId:Grapes
3  Vegetable  Potato   GSix  5678  NId  Potato  NId:Potato
4      Fruit   Apple    NaN   nan  NId   Apple   NId:Apple
5  Vegetable     NaN   GOne  5125  GId    GOne    BId:5125
6  Vegetable     NaN  GNine  5923  GId   GNine    BId:5923
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...