У меня есть фрейм данных, который имеет разные типы данных (список, словарь, список словаря, строки и т. Д.).

df = pd.DataFrame([{'category': [{'id': 1, 'name': 'House Targaryen'}],
  'connection': ['Rhaena Targaryen', 'Aegon Targaryen'],
  'description': 'Jon Snow, born Aegon Targaryen, is the son of Lyanna Stark '
                 'and Rhaegar Targaryen, the late Prince of Dragonstone',
  'name': 'Jon Snow'},
 {'category': [{'id': 2, 'name': 'House Stark'},
               {'id': 3, 'name': 'Nights Watch'}],
  'connection': ['Robb Stark', 'Sansa Stark', 'Arya Stark', 'Bran Stark'],
  'description': 'After successfully capturing a wight and presenting it to '
                 'the Lannisters as proof that the Army of the Dead are real, '
                 'Jon pledges himself and his army to Daenerys Targaryen.',
  'name': 'Jon Snow'}]) 

Я хочу объединить эти две строки с помощью Jon Snow и объединить все остальные поля вместе, чтобы это выглядело как

name                          category                                       description                                      connection

Jon Snow    ['House Targaryen','House Stark','Nights Watch'] Jon Snow, born ...... his army to Daenerys Targaryen.   ['Rhaena Targaryen',...,'Bran Stark']

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

Я также думал об использовании df.groupby('name').aggregate('category': func1,'description':func2, 'connection':func3), но я не уверен, есть ли встроенная функция для того, что мне нужно.

Спасибо всем за помощь!

0
timxymo1225 22 Окт 2019 в 19:19
Вы можете использовать groupby().apply()
 – 
pissall
22 Окт 2019 в 19:23
Если вы имеете в виду под groupby('name').apply(','.join), он будет объединять только имена столбцов вместе, поскольку типы данных различаются
 – 
timxymo1225
22 Окт 2019 в 19:31
Нет, напишите функцию, предполагая, что вы возьмете df каждой группы. Сделайте любые преобразования, которые хотите, и верните df. Примените это как df.groupby("group_col").apply(func)
 – 
pissall
22 Окт 2019 в 19:43

1 ответ

Глядя на ваши данные, можно сначала сделать простые groupby и sum. Затем разберитесь с категориями, используя понимание списка:

import pandas as pd

df = pd.DataFrame([{'category': [{'id': 1, 'name':'House Targaryen'}],
                    'name': 'Jon Snow',
                    'description':'Jon Snow, born Aegon Targaryen, is the son of Lyanna Stark and Rhaegar Targaryen, the late Prince of Dragonstone',
                    'connection':['Rhaena Targaryen', 'Aegon Targaryen']},
                   {'category': [{'id': 2, 'name': 'House Stark'},{'id': 3, 'name': 'Nights Watch'}],
                    'name': 'Jon Snow',
                    'description': 'After successfully capturing a wight and presenting it to the Lannisters as proof that the Army of the Dead are real, '
                                   'Jon pledges himself and his army to Daenerys Targaryen.',
                    'connection':['Robb Stark', 'Sansa Stark', 'Arya Stark', 'Bran Stark']},
                   {"category":[{"id":4,"name":"Some house"}],
                    "name": "Some name",
                    "description": "some desc",
                    "connection":["connection 1"]}])

result = df.groupby("name").sum()
result["category"] = [[item.get("name") for item in i] for i in result["category"]]
result.reset_index(inplace=True)

print (result)

#
            name                                      category                                        description                                         connection
0   Jon Snow  [House Targaryen, House Stark, Nights Watch]  Jon Snow, born Aegon Targaryen, is the son of ...  [Rhaena Targaryen, Aegon Targaryen, Robb Stark...
1  Some name                                  [Some house]                                          some desc                                     [connection 1]
1
Henry Yik 22 Окт 2019 в 20:08
Я думаю, что это решает примерный случай, но я понимаю, что в моем df пропущены значения почти во всех столбцах, и похоже, что sum() не знает, как с этим справиться
 – 
timxymo1225
22 Окт 2019 в 21:47