2017-01-25 4 views
1

Новый панда извините, если это старая шляпа. То, что я пытаюсь выполнить, похоже на то, что содержится в grouping rows in list in pandas groupby, но у меня есть более двух столбцов, и я не могу понять, как отобразить все мои столбцы вместе с группируемым значением. Вот что я пытаюсь сделать.pandas groupby + list

data = [{'ip': '192.168.1.1', 'make': 'Dell', 'model': 'UltraServ9000'}, 
{'ip': '192.168.1.3', 'make': 'Dell', 'model': 'MiniServ'}, 
{'ip': '192.168.1.5', 'make': 'Dell', 'model': 'UltraServ9000'}, 
{'ip': '192.168.1.6', 'make': 'HP', 'model': 'Thinger3000'}, 
{'ip': '192.168.1.8', 'make': 'HP', 'model': 'Thinger3000'}] 

In [2]: df = pd.DataFrame(data) 
In [3]: df 
Out[4]: 
      ip make   model 
0 192.168.1.1 Dell UltraServ9000 
1 192.168.1.3 Dell  MiniServ 
2 192.168.1.5 Dell UltraServ9000 
3 192.168.1.6 HP Thinger3000 
4 192.168.1.8 HP Thinger3000  

<magic> 

Out[?]:  
      ip    make   model 
0 192.168.1.1, 192.168.1.5 Dell UltraServ9000 
1 192.168.1.3    Dell  MiniServ 
3 192.168.1.6, 192.168.1.8 HP  Thinger3000 

Заранее спасибо :)

+0

Извините, но это действительно обман: http://stackoverflow.com/questions/22219004/grouping-rows-in-list-in-pandas-groupby, в основном все, что вам нужно, это 'In [107]: df.groupby ([ 'а', 'с']) [ 'B'] применить (список) Из [107]:. переменного тока Foo [1, 2] В Foo [5, 5, 4] C foo [6] Название: b, dtype: object' – EdChum

+0

Добро пожаловать в переполнение стека. В будущем, пожалуйста, создайте необработанные данные, чтобы пользователи могли экспериментировать с вашими данными - вы получите лучшие/быстрые ответы таким образом. Кроме того, «a» и «A» не подходят для использования в качестве имен столбцов и значений данных, если вы создаете примеры. – flyingmeatball

+0

Привет - это почти дубликат, но я сталкиваюсь с проблемами, так как у меня есть 20-несколько нечетных столбцов, поэтому я пытаюсь сделать это groupby на «A», список в «B», а затем просто покажите значения из всех остальных столбцов, которые одинаковы для каждой строки. – liam

ответ

2

groupby принимает параметр, by, с помощью которого можно указать list переменных, которые вы хотите управлять groupby более. Таким образом, ответ на этот вопрос изменяются следующим образом:

df.groupby(by = ["a", "c"])["b"].apply(list).reset_index() 

EDIT: Глядя на ваш комментарии: так как все, кроме a столбцов имеют то же значение, вы можете перечислить их легко в параметре by, потому что они не будут влияют на результат. Чтобы сэкономить время и предотвратить вас на самом деле ввести все имена, которые вы могли бы сделать что-то вроде этого:

df.groupby(by = list(set(df.columns) - set(["b"])))["b"].apply(list).reset_index() 

В качестве альтернативы, вы можете использовать функцию agg, передавая словарь, который для всех столбцов будет брать max и b вернет список:

aggregate_functions = {x: max for x in df.columns if x != "a" and x != "b"} 
aggregate_functions["b"] = lambda x: list(x) 
df.groupby(by = "a").agg(aggregate_functions) 

Что вы предпочитаете, зависит от вас, возможно, последнее более читаемо.

+0

Спасибо! Это близко к тому, что я ищу, и очень похоже на почти дубликат, который я связал выше. Я должен был указать, что у меня не просто три столбца (A, B, C), у меня есть 20. Я пытаюсь сгруппировать по одному, перечислить в другом, а затем просто отобразить остальные столбцы, как и они одинаковы для каждой строки. – liam

+0

Извините, я неправильно понял вопрос. См. Мое редактирование. – Mikk

+0

Полностью моя вина. Я все еще пытаюсь склонить голову вокруг панд и явно теряю эту битву. Я обновил свой пример выше, надеюсь, будет более полезным. Извините за беспорядок! – liam