#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