Добавление столбца Pandas df, который объединяет совпадающие значения из другого df - PullRequest
0 голосов
/ 16 октября 2019

Я пытаюсь создать новый столбец в фрейме данных pandas, который объединяет значения из другого фрейма данных, которые соответствуют определенному условию.

Если у меня в качестве входных данных есть Инвентаризация и продукты для фреймов данных:

Inventory

Category    All_SKU
Apple       NaN
Banana      NaN
Oranges     NaN


Products

Product       Category     SKU
Macintosh     Apple        4123
Gala          Apple        4356
Navel         Oranges      5897
Cara Cara     Oranges      5324
Red Delicious Apple        4896
Cavendish     Banana       7895

Я хочу, чтобы на выходе было

Inventory

Category    All_SKU
Apple       4123; 4356; 4896
Oranges     5897; 5324
Banana      7895

Я пробовал это (и другие подходы)но получите ключевую ошибку. Не уверен, что это лучший подход или есть лучший способ справиться с этим.

for row in Products.index:
  InvRow=Inventory.index[Inventory['Category'] == Products['Category',row]]
  Inventory['All_SKU',InvRow]=Inventory['All_SKU',InvRow] + "; "+  Products['SKU',row]

Ответы [ 4 ]

0 голосов
/ 16 октября 2019

Вы можете использовать groupby.apply + Series.map:

Inventory['All_SKU']=( Inventory['Category']
                       .map(products[products['Category'].isin(Inventory['Category'])]
                       .groupby('Category')['SKU']
                       .apply(lambda x: ','.join(x.astype(str)))) )
print(Inventory)

  Category         All_SKU
0    Apple  4123,4356,4896
1   Banana            7895
2  Oranges       5897,5324
0 голосов
/ 16 октября 2019

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

df = pd.DataFrame([['Macintosh', 'Apple', '4123'], ['Gala', 'Apple', '4356'], ['Navel', 'Oranges', '5897'], ['Cara Cara', 'Oranges', '5324'], ['Red Delicious', 'Apple', '4896'], ['Cavendish', 'Banana', '7895']], columns=('Product', 'Category', 'SKU'))
result = df.groupby("Category")["SKU"].apply(list).str.join(";")

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

df_inventory.merge(df, on="Category")
0 голосов
/ 16 октября 2019

Более простое для понимания решение для кого-то вроде меня, у которого нет лямбды и других крутых решений на 1 линию.

for d in Inventory['Category'].index:
    cat= data['Category'][d]
    data = Products.query(f"Category == '{cat}'", inplace = False) 
    t = data['SKU']
    Inventory['All_SKU'][d] = t.tolist()

(я сохранил их как список, а не как «;» разделенную строку.)

0 голосов
/ 16 октября 2019

что-то подобное должно сделать это

Products.groupby('Category').SKU.apply(lambda x: ';'.join(list(str(i) for i in list(x))))

enter image description here

Однако на вашем месте я бы использовал список, а нечем строка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...