我有两个数据文件:data_df和geo_dimension_df。
我想把geo_dimension_df的索引重新命名为id,并在data_df上设置一个名为geo_id的列。
我将把这两个数据作为表插入到数据库中,id列将是它们的主键,而geo_id是将data_df链接到geo_dimension_df的外键。
可以看到,cbsa和name值可以随时间变化。(Yuba市,CA -> Yuba City-Marysville,CA)。因此,geo_dimension_df是cbsa和name的所有独特组合。
我需要比较两个数据格式上的cbsa和name值,然后在将geo_dimension_df.id作为data_df.geo_id值进行匹配时进行比较。
我尝试了一段时间使用merge,但是很困惑,所以现在我尝试使用apply,把它看作跨多个列值的Excel,但是没有运气。以下是我的尝试,但有点胡言乱语.
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:
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, AZdata_df:
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外键列):
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注意:在此之后,我将把cbsa和name从data_df中删除,以免有人对我为什么要复制数据感到好奇。
发布于 2019-06-20 02:26:26
首先,由于索引不是正确的列,所以将其设置为列,以便在以后的merge中使用。
geo_dimension_df['geo_id'] = geo_dimension_df.index接下来,加入data_df和geo_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_df的geo_id列下。
data_df:
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 523https://stackoverflow.com/questions/56675101
复制相似问题