代码之家  ›  专栏  ›  技术社区  ›  SaadH

pandas:如何通过比较其他列值来修改dataframe中列的值

  •  1
  • SaadH  · 技术社区  · 5 年前

    我有以下结构的数据帧:

    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 ,然后是后缀 类型 与''u 1stparty'其他''u 3rdparty'一起。数据帧最终应该看起来像:

    enter image description here

    2 回复  |  直到 5 年前
        1
  •  1
  •   jezrael    5 年前

    行之间的测试值 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
    
        2
  •  0
  •   Dev Khadka    5 年前

    你可以用apply方法

    df["type"] = df.apply(lambda row: f"{row.type}_1stparty" if row.source in row.website \
                          else f"{row.type}_thirdparty", axis=1)
    df
    
        3
  •  0
  •   Mykola Zotko    5 年前

    这个解决方案必须比其他使用 apply() :

    df.type += df.website.str.split('.').str[0].eq(df.source).\
               replace({True: '_1stParty', False: '_3rdParty'})