通过Python中2个数据框之间的映射将列添加到数据框?

时间:2020-07-03 09:32:06

标签: python pandas

昨天我问了类似的问题,但是我不得不改写这个问题并更改我正在使用的数据框。所以这又是我的问题: 我有一个名为df_location的数据框。在此数据框中,我重复了ID,因为每个ID都有时间戳。

location = {'location_id': [1,1,1,1,2,2,2,3,3,3,4,5,6,7,8,9,10],
            'temperature_value':[20,21,22,23,24,25,27,28,29,30,31,32,33,34,35,36,37],
            'humidity_value':[60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76]}
df_location = pd.DataFrame(location)

我还有一个名为df_islands的数据框:

islands = {'island_id':[10,20,30,40,50,60],
             'list_of_locations':[[1],[2,3],[4,5],[6,7,8],[9],[10]]}
df_islands = pd.DataFrame(islands)

我想要实现的是将list_of_locations的值映射到location_id。如果值相同,则应将此位置的island_id附加到df_location中的新列。 (请注意:我不想删除任何重复的ID,我需要将它们保持原样)

结果数据框:

final_dataframe = {'location_id': [1,1,1,1,2,2,2,3,3,3,4,5,6,7,8,9,10],
                'temperature_value': [20,21,22,23,24,25,27,28,29,30,31,32,33,34,35,36,37],
                'humidity_value':[60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76],
                'island_id':[10,10,10,10,20,20,20,20,20,20,30,30,40,40,40,50,60]}
df_final_dataframe = pd.DataFrame(final_dataframe)

这只是我拥有的数据框中的一个示例。我所拥有的是13,000,0000行和4列的数据框。如何有效地做到这一点?我尝试过使用for循环,但是它花费的时间太长,但仍然无法正常工作。如果有人可以给我解决这个问题的方法,我将不胜感激。

1 个答案:

答案 0 :(得分:0)

这是一个解决方案:

island_lookup = df_islands.explode("list_of_locations").rename(columns = {"list_of_locations": "location"})
pd.merge(df_location, island_lookup, left_on="location_id", right_on="location").drop("location", axis=1)

输出为:

   location_id  temperature_value  humidity_value  island_id
0            1                 20              60         10
1            1                 21              61         10
2            1                 22              62         10
3            1                 23              63         10
4            2                 24              64         20
5            2                 25              65         20
6            2                 27              66         20
7            3                 28              67         20
8            3                 29              68         20
9            3                 30              69         20
10           4                 31              63         30
11           5                 32              64         30
12           6                 33              65         40
13           7                 34              66         40
14           8                 35              67         40
15           9                 36              68         50
16          10                 37              69         60

如果某些位置没有匹配的island_id,但是您仍然希望在结果中看到它们(使用island_id NaN),请在合并语句,如:

how="left"

结果将是(请注意第3行的位置ID 12):

island_lookup = df_islands.explode("list_of_locations").rename(columns = {"list_of_locations": "location"})
pd.merge(df_location, island_lookup, 
         left_on="location_id", 
         right_on="location", 
         how = "left").drop("location", axis=1)