Python Pandas: создайте новый столбец, сопоставив одно значение столбца с другой строкой [i] и столбцом, если отдельный столбец в строке [i] равен одному значению столбца

Извините за очень многословное название. У меня есть 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».

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
22
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете попробовать pd.DataFrame.merge:

df.merge(df[['username', 'user_id']].rename(
    columns = {'username':'subr_fav_by', 'user_id':'subr_fav_by_id'}), how='left')
Ответ принят как подходящий

Вы можете использовать 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

Знаете ли вы, как я мог бы обновить код, если бы один и тот же subreddit_id повторялся в нескольких строках, сопровождаемых разными строками subr_fav_by?

Elsa 11.05.2022 22:56

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

David Erickson 11.05.2022 23:09

Другие вопросы по теме