如何根据另一个数据框中某一列的值合并一个数据框的两列?

时间:2020-07-02 12:12:28

标签: python pandas

我有一个名为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中是否有方法或函数可以这样做。如果有人可以给我解决这个问题的方法,我将不胜感激。

2 个答案:

答案 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