昨天我问了类似的问题,但是我不得不改写这个问题并更改我正在使用的数据框。所以这又是我的问题: 我有一个名为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循环,但是它花费的时间太长,但仍然无法正常工作。如果有人可以给我解决这个问题的方法,我将不胜感激。
答案 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)