Панды: как изменить значения в столбце в кадре данных путем сравнения других значений столбца - PullRequest
1 голос
/ 29 сентября 2019

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

raw_data = {'website': ['bbc.com', 'cnn.com', 'google.com', 'facebook.com'], 
    'type': ['image', 'audio', 'image', 'video'], 
    'source': ['bbc','google','stackoverflow','facebook']}
df = pd.DataFrame(raw_data, columns = ['website', 'type', 'source']) 

enter image description here

Я хотел бы изменить значения в столбце type с условиемчто если source существует в website, то суффикс type с '_1stParty' иначе '_3rdParty'.Фрейм данных в конечном итоге должен выглядеть следующим образом:

enter image description here

Ответы [ 3 ]

1 голос
/ 29 сентября 2019

Проверить значения между строками с in и применить для обработки каждой строки отдельно:

m = df.apply(lambda x: x['source'] in x['website'], axis=1)

Или использовать zip с пониманием списка:

m = [a in b for a, b in zip(df['source'], df['website'])]

, а затем добавить новыйзначения по numpy.where:

df['type'] += np.where(m, '_1stParty',  '_3rdParty')
#'long' alternative
#df['type'] = df['type'] + np.where(m, '_1stParty',  '_3rdParty')
print (df)
        website            type         source
0       bbc.com  image_1stParty            bbc
1       cnn.com  audio_3rdParty         google
2    google.com  image_3rdParty  stackoverflow
3  facebook.com  video_1stParty       facebook
0 голосов
/ 29 сентября 2019

Это решение должно быть быстрее, чем другие, которые используют apply():

df.type += df.website.str.split('.').str[0].eq(df.source).\
           replace({True: '_1stParty', False: '_3rdParty'})
0 голосов
/ 29 сентября 2019

Вы можете использовать метод применения для этого, как

df["type"] = df.apply(lambda row: f"{row.type}_1stparty" if row.source in row.website \
                      else f"{row.type}_thirdparty", axis=1)
df
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...