Python:使用多列条件将dataframe的索引值设置为另一个dataframe的列

2024-10-05 10:42:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个数据帧:data_dfgeo_dimension_df。你知道吗

我想获取geo_dimension_df的索引,我将其重命名为id,并使其成为data_df上名为geo_id的列。你知道吗

我将把这两个数据帧作为表插入到数据库中,id列将是它们的主键,geo_id是将data_df链接到geo_dimension_df的外键。你知道吗

可以看出,cbsaname值可以随时间变化。(加利福尼亚州尤巴市->;加利福尼亚州马里斯维尔市尤巴市)。因此,geo_dimension_dfcbsaname的唯一组合。你知道吗

我需要比较两个数据帧上的cbsaname值,然后在匹配时将geo_dimension_df.id设置为data_df.geo_id值。你知道吗

我试过用merge一段时间,但是弄糊涂了,所以现在我试着用apply把它看作是一个跨多个列值的Excel vlookup,但是运气不好。下面是我的尝试,但有点胡说八道。。。你知道吗

data_df['geo_id'] = data_df[['cbsa', 'name']]
                        .apply(
                        lambda x, y: 
                        geo_dimension_df
                            .index[geo_dimension_df[['cbsa', 'name]]
                            .to_list()
                        == [x,y])

下面是两个原始数据帧,后跟所需的结果。非常感谢。你知道吗

地理尺寸:

       cbsa                               name
id                           
  1   10180                        Abilene, TX
  2   10420                          Akron, OH
  3   10500                         Albany, GA
  4   10540                         Albany, OR
  5   10540                 Albany-Lebanon, OR
                     ...
519   49620                   York-Hanover, PA
520   49660  Youngstown-Warren-Boardman, OH-PA
521   49700                      Yuba City, CA
522   49700           Yuba City-Marysville, CA
523   49740                           Yuma, AZ

数据类型:

             cbsa         name  month  year units_total
        id                                             
        1   10180  Abilene, TX      1  2004          22
        2   10180  Abilene, TX      2  2004          12
        3   10180  Abilene, TX      3  2004          44
        4   10180  Abilene, TX      4  2004          32
        5   10180  Abilene, TX      5  2004          21
                                 ...
    67145   49740  Yuma, AZ        12  2018          68
    67146   49740  Yuma, AZ         1  2019          86
    67147   49740  Yuma, AZ         2  2019          99
    67148   49740  Yuma, AZ         3  2019          99
    67149   49740  Yuma, AZ         4  2019          94

预期结果:
数据\u df(添加了geo \u id外键列):

             cbsa         name  month  year units_total geo_id
        id                                             
        1   10180  Abilene, TX      1  2004          22      1
        2   10180  Abilene, TX      2  2004          12      1
        3   10180  Abilene, TX      3  2004          44      1
        4   10180  Abilene, TX      4  2004          32      1
        5   10180  Abilene, TX      5  2004          21      1
                                 ...
    67145   49740  Yuma, AZ        12  2018          68    523
    67146   49740  Yuma, AZ         1  2019          86    523
    67147   49740  Yuma, AZ         2  2019          99    523
    67148   49740  Yuma, AZ         3  2019          99    523
    67149   49740  Yuma, AZ         4  2019          94    523

注意:在此之后,我将从data_df删除cbsaname,以防有人好奇我为什么要复制数据。你知道吗


Tags: 数据nameiddfdataazgeooh
1条回答
网友
1楼 · 发布于 2024-10-05 10:42:31

首先,因为索引不是正确的列,所以将其设为列,以便在以后的merge中使用:

geo_dimension_df['geo_id'] = geo_dimension_df.index

接下来,加入data_dfgeo_dimension_df

data_df = pd.merge(data_df, 
                   geo_dimension_df['cbsa', 'name', 'geo_id'],
                   on=['cbsa', 'name'],
                   how='left')  

最后,删除添加到geo_dimension_df开头的列:

geo_dimension_df.drop('geo_id', axis=1, inplace=True)

完成此操作后,geo_dimension_df的索引列id现在将出现在data_dfgeo_id下:

数据类型:

         cbsa         name  month  year units_total geo_id
    id                                             
    1   10180  Abilene, TX      1  2004          22      1
    2   10180  Abilene, TX      2  2004          12      1
    3   10180  Abilene, TX      3  2004          44      1
    4   10180  Abilene, TX      4  2004          32      1
    5   10180  Abilene, TX      5  2004          21      1
                             ...
67145   49740  Yuma, AZ        12  2018          68    523
67146   49740  Yuma, AZ         1  2019          86    523
67147   49740  Yuma, AZ         2  2019          99    523
67148   49740  Yuma, AZ         3  2019          99    523
67149   49740  Yuma, AZ         4  2019          94    523

相关问题 更多 >

    热门问题