Pandas groupby и среднее значение строки

#pandas #pandas-groupby

#pandas #pandas-groupby

Вопрос:

У меня есть образец DF:

 df = pd.DataFrame(np.random.randint(1,10,size=(6,3)),columns = list("ABC"))
df["A"] = ["1111","2222","1111","1111","2222","1111"]
df["B"] = ["20010101","20010101","20010101","20010101","20010201","20010201"]
df
  

OP:

       A       B         C
0   1111    20010101    1
1   2222    20010101    8
2   1111    20010101    1
3   1111    20010101    3
4   2222    20010201    7
5   1111    20010201    8
  

Я пытаюсь найти среднее значение столбца B с помощью grouby столбца A:

Например:

рассмотрим значение «1111» в столбце A: общее количество транзакций: 4, уникальных транзакций: 2 (20010101,20010201). таким образом, среднее значение равно 4/2 = 2

Фрагмент:

 df.groupby("A",as_index=False).agg({"B":'mean'})
  

Ошибка:

 DataError: No numeric types to aggregate
  

Любой способ pandas найти это среднее значение напрямую вместо выполнения groupby и итерации.

Ответ №1:

Я не думаю, что то, что вы ищете, это «среднее». Попробуйте это:

 df.groupby('A')['B'].apply(lambda x: x.count() / x.nunique())

A
1111    2.0
2222    1.0
Name: B, dtype: float64
  

Или, если вы хотите отказаться от использования apply , тогда

 grp = df.groupby('A')['B']
grp.count() / grp.nunique()

A
1111    2.0
2222    1.0
Name: B, dtype: float64
  

И вот один лайнер для приведенного выше, который используется agg со многими редукторами:

 df.groupby('A')['B'].agg(['count','nunique']).eval('count / nunique')

A
1111    2.0
2222    1.0
dtype: float64