我有一个名为df_location的数据框:
location = {'location_id': [1,2,3,4,5,6,7,8,9,10],
'temperature_value': [20,21,22,23,24,25,26,27,28,29],
'humidity_value':[60,61,62,63,64,65,66,67,68,69]}
df_location = pd.DataFrame(locations)
我还有一个名为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)
每个island_id对应一个或多个位置。如您所见,位置存储在列表中。 我想做的是搜索list_of_locations中的每个唯一位置,然后将其合并到df_location中,使每个island_id都对应于一个特定位置。
最终数据框应为以下内容:
merged = {'location_id': [1,2,3,4,5,6,7,8,9,10],
'temperature_value': [20,21,22,23,24,25,26,27,28,29],
'humidity_value':[60,61,62,63,64,65,66,67,68,69],
'island_id':[10,20,20,30,30,40,40,40,50,60]}
df_merged = pd.DataFrame(merged)
我不知道python中是否有方法或函数可以这样做。如果有人可以给我解决这个问题的方法,我将不胜感激。
答案 0 :(得分:0)
df.apply()
方法在这里起作用。有点long,但是可以用:
df_location['island_id'] = df_location['location_id'].apply(
lambda x: [
df_islands['island_id'][i] \
for i in df_islands.index \
if x in df_islands['list_of_locations'][i]
# comment above line and use this instead if list is stored in a string
# if x in eval(df_islands['list_of_locations'][i])
][0]
)
首先,如果if语句为True,则选择所需的最终值:df_islands['island_id'][i]
然后,我们使用df_islands
遍历df_islands.index
中的每一列
然后创建if语句,该语句遍历df_islands['list_of_locations']
中的所有值,如果True
的值在df_location['location_id']
中,则返回list
。
最后,由于我们必须在方括号中包含此长语句,因此它是一个列表。但是,我们知道列表中只有一个值,因此我们可以在末尾使用[0]
对其进行索引。
我希望这对其他编辑人员使答案更加清晰易懂而感到高兴和快乐!
print(df_location)
location_id temperature_value humidity_value island_id
0 1 20 60 10
1 2 21 61 20
2 3 22 62 20
3 4 23 63 30
4 5 24 64 30
5 6 25 65 40
6 7 26 66 40
7 8 27 67 40
8 9 28 68 50
9 10 29 69 60
答案 1 :(得分:0)
您要扩展df_islands
数据框的pandas方法是.explode(column_name)
。从那里,将您的列重命名为location_id
,然后使用pd.merge()
连接数据框。它将使用location_id作为键执行类似SQL的联接方法。
import pandas as pd
locations = {'location_id': [1,2,3,4,5,6,7,8,9,10],
'temperature_value': [20,21,22,23,24,25,26,27,28,29],
'humidity_value':[60,61,62,63,64,65,66,67,68,69]}
df_locations = pd.DataFrame(locations)
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)
df_islands = df_islands.explode(column='list_of_locations')
df_islands.columns = ['island_id', 'location_id']
pd.merge(df_locations, df_islands)
Out[]:
location_id temperature_value humidity_value island_id
0 1 20 60 10
1 2 21 61 20
2 3 22 62 20
3 4 23 63 30
4 5 24 64 30
5 6 25 65 40
6 7 26 66 40
7 8 27 67 40
8 9 28 68 50
9 10 29 69 60