#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), и получите общее количество стран, присутствующих для каждого идентификатора.
Обновить:
Мне удалось получить список стран, где 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
>>> df.query('label == 1')['country'].unique()
array(['ab', 'ee', 'my'], dtype=object)
- количество уникальных стран на идентификатор, когда метка = 1
>>> df.query('label == 1').groupby('id')['country'].nunique()
id
200 3
Name: country, dtype: int64
- Обновленная версия:
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» будет иметь значение 14. Мне удалось это сделать, хотя и крайне неуклюже.
a = calls.groupby(['id', 'country']).count().reset_index()
,b = a[a['country'].isin(country_bot)]
,c= b.groupby(['id']).count().reset_index()
5. сэр, похоже, это не работает, в итоге для каждого идентификатора присваивается значение 1. Но это нормально, неуклюжий метод, который я пробовал, работает