#python #pandas
Вопрос:
У меня есть фрейм данных с такими пользователями, как usera и userb, мне нужно сгруппироваться по этому, и у каждого пользователя есть свой уникальный идентификатор. Мне нужно получать каждый второй идентификатор пользователя не по строке, а по идентификатору. Мне удалось получить каждый второй идентификатор, но это не очень хорошо, потому что может быть несколько пользователей. Вот мой код с входами и выходами:
import pandas as pd
import numpy as np
id = ['11', '11', '11', '15', '15', '15', '23', '23', '25','25','26','26','27','27','27','28','28']
username = ['usera','usera','usera','usera','usera','usera','usera','usera','usera','usera','userb','userb','userb','userb','userb','userb','userb']
date = ['2021-05-04','2021-05-05','2021-05-05','2021-05-06','2021-06-07','2021-06-08','2021-07-09','2021-03-09','2021-04-10','2021-04-10','2021-04-10','2021-04-10','2021-04-10','2021-04-10','2021-04-10','2021-04-10','2021-04-10']
df = pd.DataFrame({'id': id, 'username': username, 'date': date})
df = df.sort_values(by=['id'], ignore_index=True) #Sort because the dataframe not sorted.
# kick out non-unique IDs
unique_ids = np.unique(df['id'])
unique_ids = df.groupby('username')['id'].agg(['unique'])
print("g")
print(unique_ids)
print("gend")
print("g2")
otherframe = pd.DataFrame(unique_ids)
print(otherframe['unique'])
# every 2nd
print(unique_ids[::2])
print("nn head")
every_2nd = df[df['id'].isin(unique_ids[::2])]
#every_2nd get new dataframe with every second id grouped by users
#username unique
#usera [11, 15, 23, 25] usera id-s
#userb [26, 27, 28] userb id-s
#usera every second id= [11, 23 ]
#userb every second id= [26, 28] userb id-s
#expected ooutput
#every_second_id_by_user = ['11', '11', '11', '23', '23', '26','26','27','27','27','28','28']
#and every second date=
Ответ №1:
Редактировать: решение @Akshay Sehgal лучше.
Если я правильно понимаю вопрос, я верю, что то, чего вы хотите, может быть достигнуто как:
df.groupby(['username', 'id'])['id'].unique()[::2]
# username id
# usera 11 [11]
# 23 [23]
# userb 26 [26]
# 28 [28]
# Name: id, dtype: object
Ключ состоит в том, чтобы сгруппироваться по имени пользователя и идентификатору, прежде чем принимать уникальные значения.
Ответ №2:
Попробуй это —
df.groupby('username')['id'].unique().str[::2]
username
usera [11, 23]
userb [26, 28]
Name: id, dtype: object
Если вы хотите дополнительно отфильтровать исходный фрейм данных для строк по этим идентификаторам, используйте это —
idx = df.groupby('username')['id'].unique().str[::2].explode()
df[df['id'].isin(idx)]
id username date
0 11 usera 2021-05-04
1 11 usera 2021-05-05
2 11 usera 2021-05-05
6 23 usera 2021-07-09
7 23 usera 2021-03-09
10 26 userb 2021-04-10
11 26 userb 2021-04-10
15 28 userb 2021-04-10
16 28 userb 2021-04-10