Как создать один столбец из нескольких столбцов в Панд с помощью .isin() и списка?

#python #pandas #dataframe #multiple-columns #isin

Вопрос:

Я разбил более сложную проблему на что-то более простое. Фактическая проблема имеет большие списки и еще несколько столбцов.

Начиная с этого df:

 i | COL1 | COL2 | COL3 | COL4 | Revenue | QTY | Products   0 | Coin | Gold Krug | Gold Coin | Coins | 2333677473 | 21 | 12  1 | Gold Coin | Coins | Gold Coin | Coins | 2564774784 | 28 | 14  2 | Gold Coin | Coins | Gold Krug | Coins |3256666647 | 35 | 16  3 |Gold Coin | Coins | Coins |Gold Krug | 3456788 | 42 | 18  4 |Gold Krug | Gold Coin | Coins | Coins | 4588960 | 49 | 20  5 |Gold Coin | Coins | Gold Krug | Coins |346869909 |56 | 22  6 |Gold Coin | Coins | Gold Coin | Coins | 3777989 |63 | 24  7 |Gold Coin |Silver Krug |Gold Coin | Coins | 37687589 |70 | 26  8 |Gold Coin | Coins |Gold Coin | Coins | 45789889 |77 | 28  9 |Gold Coin | Gold Krug |Gold Coin |Coins | 468 |84 | 30  

Я бы хотел, чтобы вывод был DF с новым столбцом, подобным этому:

 i | Category | Revenue | QTY |Products   0 |Gold Krug | 2333677473 |21 | 12  2 |Gold Krug | 3256666647 | 35 | 16  3 |Gold Krug | 3456788 | 42 | 18  4 | Gold Krug | 4588960 | 49 | 20  5 | Gold Krug | 346869909 | 56 | 22  7 | Silver Krug | 37687589 | 70 | 26  9 | Gold Krug | 468 | 84 | 30  

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

 KRUG = ['Gold Krug', 'Silver Krug', 'Gold Maple','Gold Eagle']  df = df[df[['COL1', 'COL2', 'COL3', 'COL4 ']].isin(KRUG).any(axis=1)]  print(df)  output : i |COL1 |COL2 |COL3 |COL4 |Revenue |QTY |Products   0 |Coin |Gold Krug |Gold Coin |Coins |2333677473 |21 |12  2 |Gold Coin |Coins |Gold Krug |Coins |3256666647 |35 |16  3 |Gold Coin |Coins |Coins |Gold Krug |3456788 |42 |18  4 |Gold Krug |Gold Coin |Coins |Coins |4588960 |49 |20  5 |Gold Coin |Coins |Gold Krug |Coins |346869909 |56 |22  7 |Gold Coin |Silver Krug |Gold Coin |Coins |37687589 |70 |26  9 |Gold Coin |Gold Krug |Gold Coin |Coins |468 |84 |30  

Ответ №1:

Разделите поиск на два раздела и объедините:

 category = (df.filter(like='COL')  .agg(','.join, axis = 1)  .str.extract(fr"({'|'.join(KRUG)})")  .dropna()  .set_axis(['category'], axis = 'columns')  )  others = df.loc[df.filter(like='COL').isin(KRUG).any(1),   ['Revenue', 'QTY', 'Products']]  pd.concat([category, others], axis = 'columns')   category Revenue QTY Products 0 Gold Krug 2333677473 21 12 2 Gold Krug 3256666647 35 16 3 Gold Krug 3456788 42 18 4 Gold Krug 4588960 49 20 5 Gold Krug 346869909 56 22 7 Silver Krug 37687589 70 26 9 Gold Krug 468 84 30   

Комментарии:

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

2. Мне удалось исправить NANS, но я не могу заставить другие части работать правильно. Поэтому я использовал: другие = df[df[[‘COL1’, ‘COL2’, ‘COL3’, ‘COL4 ‘]].isin(КРУГ).любые(ось=1)] другие.падение([‘COL1’, ‘COL2’, ‘COL3’, ‘COL4 ‘], ось=1, место=True) печать(другие) новый = pd.конкат([категория, другие], ось = ‘столбцы’)

Ответ №2:

Вот метод с использованием apply (), хотя должен быть более простой способ с использованием .str. Если это не слишком большая база данных, это должно быть нормально.

 import numpy as np def get_coin(x):  for k in KRUG:  if k in x.tolist():  return k  return np.nan  df['category'] = df[['COL1', 'COL2', 'COL3', 'COL4']].apply(get_coin, axis=1) df.drop(['COL1', 'COL2', 'COL3', 'COL4'], axis=1, inplace=True) df.dropna(inplace=True)   i Revenue QTY Products category 0 0 2333677473 21 12 Gold Krug 2 2 3256666647 35 16 Gold Krug 3 3 3456788 42 18 Gold Krug 4 4 4588960 49 20 Gold Krug 5 5 346869909 56 22 Gold Krug 7 7 37687589 70 26 Silver Krug