Фрейм данных Pandas получает количество категориальных значений, которые находятся в списке

#python #pandas #dataframe

Вопрос:

Я новичок в обучении машинному обучению наборам python данных и пытаюсь выполнить следующее в приведенном ниже фрейме данных (показан только фрагмент).

ID Страна устройство этикетка
100 сг samsung 0
100 гл. галактика s 0
200 ab покафон 1
200 ee iphone 1 1
200 мой iphone 2 1

я пытаюсь

  1. получите список всех стран, в которых были нанесены метки = 1
  2. для каждого идентификатора из всех стран подсчитайте страны, которые указаны в списке в 1), и получите общее количество стран, присутствующих для каждого идентификатора.

Обновить:

Мне удалось получить список стран, где label = 1. Для каждого идентификатора, как найти количество стран, которые у них есть, которые попадают в список, упомянутый ранее?

Ответ №1:

Вы можете использовать

 df.loc[ df['label'] == 1 ] ['country']
 

Это позволит определить, какие индексы имеют df[‘label’] как 1, loc использовать их и взять 'country' из них серию.

Ответ №2:

Попробуйте использовать метод доступа loc и логическую маскировку:

 count=df.loc[df['label'].eq(1),['id','country']].value_counts()
#count the values of country where 'label' is 1
lst=count.index.get_level_values(1).unique().tolist()
#get the index of count for country names
 

вывод lst :

 ['ab', 'ee', 'my']
 

вывод count :

 id   country
200  ab         1
     ee         1
     my         1
dtype: int64
 

Ответ №3:

Если я правильно понимаю:

  1. уникальные страны с меткой = 1
 >>> df.query('label == 1')['country'].unique()
array(['ab', 'ee', 'my'], dtype=object)
 
  1. количество уникальных стран на идентификатор, когда метка = 1
 >>> df.query('label == 1').groupby('id')['country'].nunique()
id
200    3
Name: country, dtype: int64
 
  1. Обновленная версия:
 countries = df.query('label == 1')['country'].unique()
df.query('country in @countries').groupby('id')['country'].nunique()
 

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

1. Привет, спасибо за помощь. Мне удалось получить список стран, где label = 1. Теперь мне нужно для каждого идентификатора найти количество стран, которые у них есть, которые попадают в список, упомянутый ранее. Могу я любезно спросить, как это возможно?

2. Я считаю, что это уже то, что делает мой код № 2. Можете ли вы дать мне ожидаемый результат?

3.со ссылкой на мой приведенный выше пример фрейма данных в вопросе. label_countries =[ 'sg', 'ch', 'ee'] . id = 100 будет иметь значение 2, в то время как «id = 200» будет иметь значение 1

4. Мне удалось это сделать, хотя и крайне неуклюже. a = calls.groupby(['id', 'country']).count().reset_index() , b = a[a['country'].isin(country_bot)] , c= b.groupby(['id']).count().reset_index()

5. сэр, похоже, это не работает, в итоге для каждого идентификатора присваивается значение 1. Но это нормально, неуклюжий метод, который я пробовал, работает