为了账号安全,请及时绑定邮箱和手机立即绑定

基于Python中的多个条件将来自多个数据帧的一列合并到另一个数据帧

基于Python中的多个条件将来自多个数据帧的一列合并到另一个数据帧

有只小跳蛙 2021-12-17 15:45:18
假设我有一个名为df如下的组合数据框。每行都有建筑物的信息及其匹配的建筑物的信息。我希望合并id来自 df1、df2 和 df3 的每个建筑物(见下文)。df_num或的列matched_df_num用于区分建筑物信息来自哪个数据框,如果它等于 1,则表示它来自df1,2 表示来自df2,3 表示来自df3。   df_num       city                             name  matched_df_num  \0      1   Shenzhen                      Kingkey 100              2   1      2   Shenzhen           Ping An Finance Centre              2   2      2   Shenzhen           Ping An Finance Centre              3   3      2  Guangzhou     Guangzhou CTF Finance Centre              3   4      3   Shanghai  Shanghai World Financial Center              3     matched_city                     matched_name  similarity_ratio  0     Shenzhen           Ping An Finance Centre                51  1    Guangzhou     Guangzhou CTF Finance Centre                66  2     Shanghai  Shanghai World Financial Center                59  3     Shanghai  Shanghai World Financial Center                56  4     Changsha            Changsha IFS Tower T1                57  我想合并的列id从s df1,df2和df3下面的建筑物名称和匹配的名称:df1 = pd.DataFrame(np.array([    [1010667747, 'Suzhou', 'Suzhou IFS'],    [1010667356, 'Shenzhen', 'Kingkey 100'],    [1010667289, 'Wuhan', 'Wuhan Center']]),    columns=['id', 'city', 'name'])df2 = pd.DataFrame(np.array([    [190010, 'Shenzhen', 'Ping An Finance Centre'],    [190012, 'Guangzhou', 'Guangzhou CTF Finance Centre'],    [190015, 'Beijing', 'China Zun']]),    columns=['id', 'city', 'name'])df3 = pd.DataFrame(np.array([    ['ZY-13', 'Shanghai', 'Shanghai World Financial Center'],    ['ZY-15', 'Hong Kong', 'International Commerce Centre'],    ['ZY-16', 'Changsha', 'Changsha IFS Tower T1']]),    columns=['id', 'city', 'name'])
查看完整描述

2 回答

?
至尊宝的传说

TA贡献1789条经验 获得超10个赞

您可以使用concatwithmerge和 left join:


dff = pd.concat([df1, df2, df3])

print (dff)

           id       city                             name

0  1010667747     Suzhou                       Suzhou IFS

1  1010667356   Shenzhen                      Kingkey 100

2  1010667289      Wuhan                     Wuhan Center

0      190010   Shenzhen           Ping An Finance Centre

1      190012  Guangzhou     Guangzhou CTF Finance Centre

2      190015    Beijing                        China Zun

0       ZY-13   Shanghai  Shanghai World Financial Center

1       ZY-15  Hong Kong    International Commerce Centre

2       ZY-16   Changsha            Changsha IFS Tower T1


df = df.merge(dff,on = ['city', 'name'], how = 'left')

print (df)

   df_num       city                             name  matched_df_num  \

0       1   Shenzhen                      Kingkey 100               2   

1       2   Shenzhen           Ping An Finance Centre               2   

2       2   Shenzhen           Ping An Finance Centre               3   

3       2  Guangzhou     Guangzhou CTF Finance Centre               3   

4       3   Shanghai  Shanghai World Financial Center               3   


  matched_city                     matched_name  similarity_ratio          id  

0     Shenzhen           Ping An Finance Centre                51  1010667356  

1    Guangzhou     Guangzhou CTF Finance Centre                66      190010  

2     Shanghai  Shanghai World Financial Center                59      190010  

3     Shanghai  Shanghai World Financial Center                56      190012  

4     Changsha            Changsha IFS Tower T1                57       ZY-13

然后再次合并,为避免重复列使用rename:


d = {'city':'matched_city','name':'matched_name', 'id':'matched_id'}

df5 = df.merge(dff.rename(columns=d),on = ['matched_city', 'matched_name'], how = 'left')

print (df5)

   df_num       city                             name  matched_df_num  \

0       1   Shenzhen                      Kingkey 100               2   

1       2   Shenzhen           Ping An Finance Centre               2   

2       2   Shenzhen           Ping An Finance Centre               3   

3       2  Guangzhou     Guangzhou CTF Finance Centre               3   

4       3   Shanghai  Shanghai World Financial Center               3   


  matched_city                     matched_name  similarity_ratio          id  \

0     Shenzhen           Ping An Finance Centre                51  1010667356   

1    Guangzhou     Guangzhou CTF Finance Centre                66      190010   

2     Shanghai  Shanghai World Financial Center                59      190010   

3     Shanghai  Shanghai World Financial Center                56      190012   

4     Changsha            Changsha IFS Tower T1                57       ZY-13   


  matched_id  

0     190010  

1     190012  

2      ZY-13  

3      ZY-13  

4      ZY-16   

编辑:您可以DataFrame.assign首先向每个 DataFrame 添加新值,然后也通过此列合并:


dff = pd.concat([df1.assign(df_num=1), df2.assign(df_num=2), df3.assign(df_num=3)])

df = df.merge(dff,on = ['city', 'name','df_num'], how = 'left')


d = {'city':'matched_city','name':'matched_name', 'id':'matched_id','df_num':'matched_df_num'}

df5 = (df.merge(dff.rename(columns=d), 

                on = ['matched_city', 'matched_name','matched_df_num'], 

                how = 'left'))

print (df5)

   df_num       city                             name  matched_df_num  \

0       1   Shenzhen                      Kingkey 100               2   

1       2   Shenzhen           Ping An Finance Centre               2   

2       2   Shenzhen           Ping An Finance Centre               3   

3       2  Guangzhou     Guangzhou CTF Finance Centre               3   

4       3   Shanghai  Shanghai World Financial Center               3   


  matched_city                     matched_name  similarity_ratio          id  \

0     Shenzhen           Ping An Finance Centre                51  1010667356   

1    Guangzhou     Guangzhou CTF Finance Centre                66      190010   

2     Shanghai  Shanghai World Financial Center                59      190010   

3     Shanghai  Shanghai World Financial Center                56      190012   

4     Changsha            Changsha IFS Tower T1                57       ZY-13   


  matched_id  

0     190010  

1     190012  

2      ZY-13  

3      ZY-13  

4      ZY-16  


查看完整回答
反对 回复 2021-12-17
?
慕丝7291255

TA贡献1859条经验 获得超6个赞

试试这个,它可能会帮助你解决你的问题


    df1 = pd.DataFrame(np.array([

[1010667747, 'Suzhou', 'Suzhou IFS'],

[1010667356, 'Shenzhen', 'Kingkey 100'],

[1010667289, 'Wuhan', 'Wuhan Center']]),

columns=['id', 'city', 'name']

)

df2 = pd.DataFrame(np.array([

    [190010, 'Shenzhen', 'Ping An Finance Centre'],

    [190012, 'Guangzhou', 'Guangzhou CTF Finance Centre'],

    [190015, 'Beijing', 'China Zun']]),

    columns=['id', 'city', 'name']

)

df3 = pd.DataFrame(np.array([

    ['ZY-13', 'Shanghai', 'Shanghai World Financial Center'],

    ['ZY-15', 'Hong Kong', 'International Commerce Centre'],

    ['ZY-16', 'Changsha', 'Changsha IFS Tower T1']]),

    columns=['id', 'city', 'name']

)


df1['df_type'] = 1

df2['df_type'] = 2

df3['df_type'] = 3


df = pd.concat([df1,df2,df3])


df


查看完整回答
反对 回复 2021-12-17
  • 2 回答
  • 0 关注
  • 198 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信