Группировка фрейма данных по одному столбцу и добавление информации на основе столбца

У меня есть такой фрейм данных:

df = pd.DataFrame({1:[1,1,1,2,2,2,3,4,5,6,7,8,9],
                   2:["a","a","x","b","b","y","c","d","e","f","g","h","i"],
                   3:[0.5,0.6,0.7,0.8,0.9,0.10,0.11,0.13,0.13,0.14,0.15,0.16,0.17]})
    1  2     3
0   1  a  0.50
1   1  a  0.60
2   1  x  0.70
3   2  b  0.80
4   2  b  0.90
5   2  y  0.10
6   3  c  0.11
7   4  d  0.13
8   5  e  0.13
9   6  f  0.14
10  7  g  0.15
11  8  h  0.16
12  9  i  0.17

Я хочу:

  1. Сгруппируйте элементы по первому столбцу, чтобы он состоял из уникальных значений.
  2. Присоедините к этой группе среднее значение третьего столбца.
  3. Прикрепите информацию второго столбца к каждому соответствующему первому столбцу.

Я могу сделать (1) и (2) следующим методом:

In [33]: df.groupby(1).mean()
Out[33]: 
      3
1      
1  0.60
2  0.60
3  0.11
4  0.13
5  0.13
6  0.14
7  0.15
8  0.16
9  0.17

Однако я не уверен, как прикрепить второй столбец к группе.

Я пробовал группировать по нескольким столбцам:

In [34]: df.groupby([1,2]).mean()
Out[34]: 
        3
1 2      
1 a  0.55
  x  0.70
2 b  0.60
3 c  0.11
4 d  0.13
5 e  0.13
6 f  0.14
7 g  0.15
8 h  0.16
9 i  0.17

Но в фактическом наборе данных он пропускает несколько записей.

Если вы заметили, в фрейме данных есть некоторые различия в данных второго столбца для каждой записи (номер 1 в столбце 1 имеет 2 "а" и "х", а номер 2 имеет 2 "б" и "у") . Это связано с тем, что в фактическом наборе данных есть незначительные различия между записями из-за ошибок и незначительных (но незначительных) различий в строковых данных.

Редактировать

Вышеизложенное является лишь концептуальным изложением проблемы. Если вам нужно что-то более осязаемое, это набор данных. Я хочу сгруппировать по столбцам "CUSTOMERS NAME" и "CUSTOMER ADDRESS" при поиске среднего значения, но группировка по двум из них одновременно приводит к потере записей по какой-то причине. Если сгруппировать исключительно по "CUSTOMER NAME", то получится чуть более 4300 записей.

In [35]: len(ensemble.("CUSTOMERS NAME").mean())
Out[35]: 4376

Но если я сгруппирую как по имени, так и по адресу, он существенно упадет:

In [36]: len(ensemble.groupby(["CUSTOMERS NAME","CUSTOMER ADDRESS"]).mean())
Out[36]: 4154

Я знаю, что где-то что-то не так, потому что общее количество уникальных значений в столбцах "CUSTOMERS NAME" равно 4376.

Для пояснения вывод должен быть фреймом данных с тремя столбцами. Первое — это имя клиента, второе — это адрес, связанный с именем клиента (с первым все в порядке), третье — это средства транзакций этого клиента.

Каков ваш ожидаемый результат?

Mayank Porwal 13.12.2020 07:58

После того, как вы сгруппируете, в каждой группе будет только одна запись. Таким образом, вы не можете просто так прикрепить значения второго столбца. Вы можете создать список значений второго столбца для каждой группы и прикрепить его к сгруппированному df.

Mayank Porwal 13.12.2020 07:59

@MayankPorwal это должен быть фрейм данных с тремя столбцами. Первое — это имя клиента, второе — это адрес, связанный с именем клиента (с первым все в порядке), третье — это средства транзакций этого клиента.

Bobby 13.12.2020 08:01

Проверьте мой ответ, пожалуйста.

Mayank Porwal 13.12.2020 08:03
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
4
59
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если значение first из 2 столбца в порядке, вы можете использовать Groupby.agg:

In [583]: x = df.groupby(1, as_index=False).agg({2:'first', 3:'mean'})

In [584]: x
Out[584]: 
   1  2     3
0  1  a  0.60
1  2  b  0.60
2  3  c  0.11
3  4  d  0.13
4  5  e  0.13
5  6  f  0.14
6  7  g  0.15
7  8  h  0.16
8  9  I  0.17

ИЛИ, если вам нужны все значения, у вас может быть список:

In [586]: x = df.groupby(1, as_index=False).agg({2: list, 3:'mean'})

In [587]: x
Out[587]: 
   1          2     3
0  1  [a, a, x]  0.60
1  2  [b, b, y]  0.60
2  3        [c]  0.11
3  4        [d]  0.13
4  5        [e]  0.13
5  6        [f]  0.14
6  7        [g]  0.15
7  8        [h]  0.16
8  9        [i]  0.17

Другие вопросы по теме