Pandas: как эффективно фильтровать данные на основе их частоты

#python #pandas #dataframe

#python #pandas #dataframe

Вопрос:

У меня есть фрейм данных с тремя столбцами: подписчик, пользователь и соотношение.

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

 known_follower_id= np.unique(following_df.follower.values) # IDs of members of the list in the saved database
userid, counts = np.unique(following_df.user.values, return_counts= True) # ID of people they followed in the saved database
count_idx=np.argsort(-counts) # number of times a user was followed
trimmed_following_df= following_df.copy(deep= True)

th = 5
idx_th = counts< th

userid_removed = userid[idx_th]
idx_userid_rem= [i for i,v in enumerate(trimmed_following_df.user.values) if v in userid_removed]

trimmed_following_df=trimmed_following_df.drop(idx_userid_rem)
 

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

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

Ответ №1:

Вместо данных, вот как я бы это сделал. Посмотрите, поможет ли это вам получить то, что вы хотите.

 import pandas as pd
df = pd.DataFrame({
    'follower': ['John', 'Jane', 'Jack', 'Suzy', 'Kate', 'Mark', 'Alex', 'Boby', 'Cris', 'Duke'],
    'user':     ['milk', 'milk', 'milk', 'milk', 'milk', 'milk', 'pear', 'pear', 'wire', 'silk'],
    'ratio':    [.4, .4, .5, .2, .6, .3, .5, .8, .9, .2]})
print (df)

df['usercount'] = df['user'].map(df['user'].value_counts())

df = df[df['usercount'] > 5]
df.drop(columns=['usercount'],inplace=True)
print (df)
 

Результатом этого будет:

Исходный фрейм данных:

   follower  user  ratio
0     John  milk    0.4
1     Jane  milk    0.4
2     Jack  milk    0.5
3     Suzy  milk    0.2
4     Kate  milk    0.6
5     Mark  milk    0.3
6     Alex  pear    0.5
7     Boby  pear    0.8
8     Cris  wire    0.9
9     Duke  silk    0.2
 

Обновленный фрейм данных:

   follower  user  ratio
0     John  milk    0.4
1     Jane  milk    0.4
2     Jack  milk    0.5
3     Suzy  milk    0.2
4     Kate  milk    0.6
5     Mark  milk    0.3