@GreenX5

Python Pandas, как вычислить среднее с подсчетом повторов одновременно?

Пытаюсь группировать данные с вычислением среднего, но теряю столбец. Как его сохранить?
И как добавить столбец с числом подсчета вхождений?

import pandas as pd

df = pd.DataFrame([['zet', 'z', '40%'],['Iks', 'x', '10%'],['Igrek', 'y', '5%'],['Iks', 'x', '20%']] , columns=['Name', 'Symbol', 'Value'])
print(df)
df = df.replace('%','',regex=True)
df['Value'] = pd.to_numeric(df['Value'])
df1 = df.groupby(['Symbol']).mean().sort_values(by=['Value'], ascending=False)
print(df1)
  • Вопрос задан
  • 498 просмотров
Решения вопроса 1
@PavelMos
Так ведь в этой программе новый столбец в датафрейме не создаётся. Чтобы создать нужно ему дать имя:
df['newcol']=...какие-то действия...

Далее, среднее от чего ? Если от Value то оно будет 75/4=18,75 т.е. это будет прописано в каждой строке в новом столбце ?
Тогда просто
df['mean1']=df['Value'].mean() # значение mean пропишется в каждой строке столбца


UPD колонка пропадает потому что pandas вероятно берёт в результат только указанную колонку Symbol и ко всем остальным цифровым применяет агрегатную функцию , в данном случаем mean(). Оставлять другие текстовые колонки в результирующем наборе было бы бессмысленно т.к. часть строк из них при группировке по Symbol просто пропадёт.

Относительно добавления сразу двух столбцов - можно посмотреть "pandas add multiple columns". Можно например так
df['a'], df['b']=list1,list2 #оба списка по длине равны длине колонки


но с учётом того, что в этой же строке нужно посчитать count() и прописать соответствующее значение в строки с каждым соответствующим значением Value получится довольно громоздкая конструкция.
df.groupby(['Name']).size()
Out[95]: 
Name
Igrek    1
Iks      2
zet      1
dtype: int64


Затем создать соответствие элемент/число вхождений, и по этому соответствию прописать цифры в новом столбце по каждой строке
df.groupby(['Name']).size().index.tolist()
df.groupby(['Name']).size().tolist() 
d=dict( zip (df.groupby(['Name']).size().index.tolist(), df.groupby(['Name']).size().tolist() ) )
d
Out[98]: {'Igrek': 1, 'Iks': 2, 'zet': 1}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы