Как фильтровать данные с помощью pandas и преобразовывать их в список?

#python #pandas

#питон #панды

Вопрос:

Это один из вопросов и задач, которые я должен выполнять чаще всего в течение дня.

У меня есть следующие столбцы фрейма данных:

 USER_ID, BRAND_ID, CLICKS
1, 100, 50
2, 120, 40
1, 200, 4
....
 

И мне нужно преобразовать его в список, например, для пользователя 1

 [100, 200]
 

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

1. {k:v for k, v in df.groupby('USER_IF')['BRAND_ID']}

2. Вы хотите создать dict с USER_ID as key, BRAND_ID as values и выбросить CLICKS ?

3. Да, правильно 🙂

Ответ №1:

Давайте подумаем, что мы уже прочитали файл CVS через pandas

 path = 'data/users_clicks.csv'
df = pd.read_csv(path)
 

И тогда у вас есть следующие столбцы:

 USER_ID, BRAND_ID, CLICKS
1, 100, 50
2, 120, 40
1, 200, 4
....
 

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

Чтобы иметь возможность фильтровать их по pandas и не использовать for , мы делаем:

 user_list = df[df['USER_ID'] == 1]
print(user_list['BRAND_ID'].tolist())
 

Результат:

 [100, 200]
 

Таким образом, вы экономите много итеративного кода и используете Pandas для его достижения.

Ответ №2:

Сгруппируйте по USER_ID и выберите BRAND_ID , агрегированный в список:

 df.groupby('USER_ID')['BRAND_ID'].agg(list)

# Gives:
USER_ID
1    [100, 200]
2         [120]
Name:  BRAND_ID, dtype: object
 

Преобразуйте это в a dict , чтобы получить его в форме {USER_ID: [list of BRAND_IDS]} для всех пользователей:

 user_brands = df.groupby('USER_ID')['BRAND_ID'].agg(list).to_dict()

# {1: [100, 200], 2: [120]}
 

А затем получить его только для пользователя 1 :

 user_brands[1]

# [100, 200]