У меня есть датафрейм, как показано ниже:
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 в зависимости от логики, закодированной выше.