#python #pandas #dataframe #count #cluster-computing
Вопрос:
У меня есть фрейм данных с кластерами. В этом фрейме данных я хочу подсчитать, сколько раз определенное значение встречается внутри кластера. Например:
data = {'cluster':['1001', '1001', '1001', '1002', '1002', '1002'],
'attribute':['1', '2', '1', '1', '2', '2']}
df = pd.DataFrame(data)
df
Я хочу подсчитать, сколько раз «1» возникало внутри каждого кластера. Я пробовал использовать лямбда-функции, и хотя попытка усреднить внутри кластера работает, подсчет не работает.
Для усреднения я использовал:
df['newcol'] = df.groupby('cluster')['attribute'].transform(lambda x: x.mean())
df
Используя то же самое, но со средним значением, замененным на количество:
df['newcol'] = df.groupby('cluster')['attribute'].transform(lambda x: x.count('2'))
df
Выдает мне эту ошибку:
Ошибка: «Запрошенный уровень (3) не соответствует имени индекса (нет)»
В идеале я хочу добавить счетчик в качестве дополнительного столбца, поэтому использую функцию lambda.
Пожалуйста, помогите мне в решении этой проблемы! Если потребуется какая-либо дополнительная информация или если я не был ясен, я был бы рад добавить информацию!
Редактировать
Спасибо, @Rutger предоставил то, что я искал. В сущности, я хотел создать новый столбец, который показывал бы мне, сколько раз атрибут встречался в кластере. Мне также нужно было, чтобы он был обобщаемым, чтобы можно было вычислить все атрибуты.
Отдельно отметим, что мой фрейм данных состоит примерно из 600 000 строк. Есть ли рекомендуемый способ, возможно, извлечь фрагмент из этого набора данных, чтобы я мог выполнить свою работу над этим? Если где-то еще есть аналогичный ответ, пожалуйста, укажите мне на то же самое! Спасибо!
Комментарии:
1. Блоки кода «усреднение» и «замена на количество» одинаковы. Можете ли вы обновить свой вопрос, чтобы включить, как выглядел ваш код подсчета?
2. О, мне очень жаль, я пропустил это. Спасибо, что указали!
Ответ №1:
Есть много способов сделать это. Я бы выбрал группу с обоими столбцами, а затем вы просто увидите, как часто они встречаются. Это не самый простой метод, который я предполагаю, но я думаю, что это тот результат, который вы ищете.
df['count'] = df.set_index(['cluster', 'attribute']).index.map(df.groupby(['cluster', 'attribute']).size())
Комментарии:
1. Большое вам спасибо! Это именно то, что я искал, но, думаю, я не смог четко выразить то, что мне было нужно. Спасибо, что читаешь между строк!
2. Добро пожаловать! Иногда это трудно выразить словами. Когда я впервые увидел ваш вопрос, я подумал, что вам просто нужно количество значений каждой пары, но затем сохранить его в качестве дополнительного столбца-это сложная часть. Удачи!
Ответ №2:
Поскольку вы хотите добавить столбец вместе с существующими столбцами, чтобы показать количество 1's
в кластере (группе), вы можете продолжать использовать .transform()
, как вы делаете это сейчас.
Внутри .transform()
, вы можете использовать функцию лямбда, чтобы проверить элементы, равные «1», и получить sum()
(вместо количества) таких True
записей, как показано ниже:
df['newcol'] = df.groupby('cluster')['attribute'].transform(lambda x: x.eq('1').sum())
Результат:
print(df)
cluster attribute newcol
0 1001 1 2
1 1001 2 2
2 1001 1 2
3 1002 1 1
4 1002 2 1
5 1002 2 1
Комментарии:
1. Это хорошо работает, но я не уверен, как это обобщить. Например, если я хочу, чтобы новый столбец отображал, сколько раз » 1 «происходило в кластере, соответствующем строке атрибута «1», и сколько раз » 2 «происходило в кластере, соответствующем строке атрибута «2», я не знаю, как обобщить этот ответ. Вот почему ответ, предоставленный @Rutger, является для меня наиболее полезным. Тем не менее, спасибо вам!