首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python熊猫:使用多列条件将dataframe的索引值设置为另一个dataframe列

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

Stack Overflow用户
提问于 2019-06-19 20:05:07
回答 1查看 56关注 0票数 0

我有两个数据文件:data_dfgeo_dimension_df

我想把geo_dimension_df的索引重新命名为id,并在data_df上设置一个名为geo_id的列。

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

可以看到,cbsaname值可以随时间变化。(Yuba市,CA -> Yuba City-Marysville,CA)。因此,geo_dimension_dfcbsaname的所有独特组合。

我需要比较两个数据格式上的cbsaname值,然后在将geo_dimension_df.id作为data_df.geo_id值进行匹配时进行比较。

我尝试了一段时间使用merge,但是很困惑,所以现在我尝试使用apply,把它看作跨多个列值的Excel,但是没有运气。以下是我的尝试,但有点胡言乱语.

代码语言:javascript
复制
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])

下面是两个原始数据文件,后面跟着所需的结果。谢谢。

geo_dimension_df:

代码语言:javascript
复制
       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

data_df:

代码语言:javascript
复制
             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

预期结果:

data_df (添加了geo_id外键列):

代码语言:javascript
复制
             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

注意:在此之后,我将把cbsanamedata_df中删除,以免有人对我为什么要复制数据感到好奇。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-20 02:26:26

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

代码语言:javascript
复制
geo_dimension_df['geo_id'] = geo_dimension_df.index

接下来,加入data_dfgeo_dimension_df

代码语言:javascript
复制
data_df = pd.merge(data_df, 
                   geo_dimension_df['cbsa', 'name', 'geo_id'],
                   on=['cbsa', 'name'],
                   how='left')  

最后,在开始时删除添加到geo_dimension_df的列:

代码语言:javascript
复制
geo_dimension_df.drop('geo_id', axis=1, inplace=True)

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

data_df:

代码语言:javascript
复制
         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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56675101

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档