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

#python #python-3.x #pandas #dataframe

#python #python-3.x #панды #фрейм данных

Вопрос:

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

 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
 

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

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

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

Все вышесказанное является лишь концептуальным изложением проблемы. Если вам нужно что-то более осязаемое, то это набор данных. Я хочу группировать по "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.

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

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

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

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

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

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

Ответ №1:

Если first значение из 2 col в порядке, вы можете использовать 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