Извините за очень многословное название. У меня есть df, который выглядит так:
df:
username user_id subreddit_id subr_fav_by
0 'John69' 1 1 '5illycat'
1 'John69' 1 2 'adsgd'
2 'Harry12' 2 3 '5illycat'
3 'adsgd' 3 4 'John69'
4 '5illycat' 4 5 'John69'
Я хочу, чтобы df выглядел так:
df:
username user_id subreddit_id subr_fav_by subr_fav_by_id
0 'John69' 1 1 '5illycat' 4
1 'John69' 1 2 'adsgd' 3
2 'Harry12' 2 3 '5illycat' 4
3 'adsgd' 3 4 'John69' 1
4 '5illycat' 4 5 'John69' 1
Итак, я хочу создать пятый столбец, который является «user_id» из строки, содержащей «автор», которая соответствует строке в столбце «subr_faved_by».
Я изначально пробовал:
for i in range(len(df['user_id'])):
for j in range(len(df['subr_fav_by'])):
df.loc[j,'subr_fav_by'] = df.loc[i,'user_id'].where(df.loc[j,'subr_fav_by'].str.contains(df.loc[i,'username']))
но получил ошибку:
TypeError: unhashable type: 'Series'
который я пытался найти, но не смог найти то, что помогло бы мне в этой конкретной ситуации.
Итак, я попробовал:
df['subr_fav_by_id'] = df['subr_fav_by'].map(df.drop_duplicates('username').set_index('username')['user_id'])
Но я не уверен, почему это возвращает только NaN в столбце «subr_fav_by_id».






Вы можете использовать merge и drop_duplicates() с iloc[:,-1], чтобы просто добавить в последний столбец.
df['subr_fav_by_id'] = df.merge(df[['username', 'user_id']].drop_duplicates(),
how='left',
left_on='subr_fav_by',
right_on='username').iloc[:,-1]
df
Out[1]:
username user_id subreddit_id subr_fav_by subr_fav_by_id
0 'John69' 1 1 '5illycat' 4
1 'John69' 1 2 'adsgd' 3
2 'Harry12' 2 3 '5illycat' 4
3 'adsgd' 3 4 'John69' 1
4 '5illycat' 4 5 'John69' 1
@elsa для этой проблемы, subreddit_id не имеет значения для удаления дубликатов и слияния. т.е. этот столбец может содержать любую серию чисел, а данные во всех других столбцах будут одинаковыми.
Знаете ли вы, как я мог бы обновить код, если бы один и тот же subreddit_id повторялся в нескольких строках, сопровождаемых разными строками subr_fav_by?