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

#python #pandas #dataframe #merge #append

Вопрос:

У меня есть два фрейма данных

 jedis = {jedi_id': ["2", "4", "6", "1"],
'name':["Kylo", "Bastila", "Revan", "Steve from Minecraft"],
'Looted Items':}

inventory = {jedi_number': ["9", "4" , "6", "1", "1", "0", "2", "6", "1" , "55", "4", 
"4", "0", "9"], 'Loot':["Holocron", "Bantha Fodder", "Blaster", "Bantha Fodder", "Credits", "Bantha Fodder", "Blaster", "Bantha Fodder", "Holocron", "Blaster", "Holocron", "bread loaf", "Credits", "Holocron"]}

jedis_df = pd.DataFrame(jedis)
inventory_df = pd.DataFrame(inventory)
 
  • Поэтому в этой проблеме мне нужно взять всех джедаев из jedis_df через jedi_df и подтвердить, что
    они существуют в inventory_df. (например,jedi_id 2 существует в инвентаре)
  • Как только идентификатор идентифицирован и находится в jedis_df, связанный с ним разграбленный предмет присоединится к jedis_df с соответствующим идентификатором
    • Пример: У Ревана будет «бластер, голокрон» в столбце «Награбленные предметы» и та же ячейка рядом с соответствующим идентификатором джедая
     x = jedis_df.merge(
    inventory_df.groupby("jedi_number").sum(),
    left_on="jedi_id",
    right_index=True,
    how="left",
    )
     
  • Я попытался объединить две таблицы, но не смог найти способ найти решение.
  • Я действительно знаю только, как добавить один конкретный соответствующий идентификатор соответствия в одну ячейку, так что это ново для меня.

Если бы кто-нибудь мог помочь с этой проблемой, я был бы очень признателен

Ответ №1:

groupby.sum автоматически исключает нечисловые столбцы, поэтому он не объединяет строки внутри групп так, как вы могли бы ожидать.

Решение состоит в том, чтобы работать ', ',join со Loot значениями каждой группы.

Вариант 1: groupby.agg

 inventory_df.groupby("jedi_number")['Loot'].agg(', '.join)
 

Вариант 2: groupby.apply

 inventory_df.groupby("jedi_number")['Loot'].apply(lambda x: ', '.join(x))
 

Оба варианта дают одинаковый результат:

 jedi_number
0                  Bantha Fodder, Credits
1        Bantha Fodder, Credits, Holocron
2                                 Blaster
4     Bantha Fodder, Holocron, bread loaf
55                                Blaster
6                  Blaster, Bantha Fodder
9                      Holocron, Holocron
Name: Loot, dtype: object
 

Замена inventory_df.groupby("jedi_number").sum() любого из этих параметров в вашем выражении для x должна привести к желаемому результату.

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

1. Это Сработало! Большое вам спасибо! Пришлось преобразовать вывод в DF и повторно проиндексировать фрейм данных, но отличное решение.