如何将两个pandas数据帧合并到两个不同的列上,这些列的元素不按顺序排列?

2024-05-14 01:20:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个数据集如下:

          name  Longitude   Latitude      continent
0        Aruba -69.982677  12.520880  North America
1  Afghanistan  66.004734  33.835231           Asia
2       Angola  17.537368 -12.293361         Africa
3     Anguilla -63.064989  18.223959  North America
4      Albania  20.049834  41.142450         Europe

另一个数据集如下:

^{pr2}$

在这里,列nameCOUNTRY包含国家名称,但顺序不同。在

如何将第二个数据帧合并为第一个数据帧,并将CODE列添加到第一个数据帧中。在

所需输出:

          name  Longitude   Latitude      continent   CODE
0        Aruba -69.982677  12.520880  North America   NaN
1  Afghanistan  66.004734  33.835231           Asia   AFG
2       Angola  17.537368 -12.293361         Africa   NaN
3     Anguilla -63.064989  18.223959  North America   NaN
4      Albania  20.049834  41.142450         Europe   ALB

尝试:

import numpy as np
import pandas as pd

df = pd.DataFrame({'name' : ['Aruba', 'Afghanistan', 'Angola', 'Anguilla', 'Albania'],
          'Longitude' : [-69.982677, 66.004734, 17.537368, -63.064989, 20.049834],
          'Latitude' : [12.520880, 33.835231, '-12.293361', 18.223959, 41.142450],
          'continent' : ['North America','Asia','Africa','North America','Europe'] })
print(df)

df2 = pd.DataFrame({'COUNTRY' :  ['Afghanistan', 'Albania', 'Algeria', 'American Samoa', 'Andorra'],
          'GDP (BILLIONS)' : [21.71, 13.40, 227.80, 0.75, 4.80],
          'CODE' : ['AFG', 'ALB', 'DZA', 'ASM', 'AND']})
print(df2)


pd.merge(left=df, right=df2,left_on='name',right_on='COUNTRY')
# but this fails

Tags: 数据namepdarubacontinentlatitudenorthasia
3条回答

熊猫有pd合并[https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.merge.html]函数,默认情况下使用内部联接。如果两个数据帧中要合并的键不同,内部联接基本上只接受在onleft_onright_on中指定的两个键中都存在的值。在

由于需要添加CODE值,因此可以使用以下代码行:

pd.merge(left=df, right=df2[['COUNTRY', 'CODE']], left_on='name', right_on='COUNTRY', how='left')

这将产生以下输出:

          name  Longitude   Latitude      continent      COUNTRY CODE
0        Aruba -69.982677  12.520880  North America          NaN  NaN
1  Afghanistan  66.004734  33.835231           Asia  Afghanistan  AFG
2       Angola  17.537368 -12.293361         Africa          NaN  NaN
3     Anguilla -63.064989  18.223959  North America          NaN  NaN
4      Albania  20.049834  41.142450         Europe      Albania  ALB

以下也给出了相同的结果:

new_df = pd.merge(left=df1[['COUNTRY', 'CODE']], right=df, left_on='COUNTRY', right_on='name', how='right')

^{pr2}$

默认情况下,^{}使用how='inner',它使用两个数据帧之间的键的交集。在这里,您需要how='left'来仅使用left数据帧中的键:

res = pd.merge(df, df2, how='left', left_on='name', right_on='COUNTRY')

默认情况下,合并执行“内部”合并或联接,只保留左右两侧都匹配的记录。您需要一个“outer”联接,保留所有记录(也有“left”或“right”)。在

示例:

import pandas as pd

df1 = pd.DataFrame({
    'name': ['Aruba', 'Afghanistan', 'Angola', 'Anguilla', 'Albania'],
    'Longitude': [-69.982677, 66.004734, 17.537368, -63.064989, 20.049834],
    'Latitude': [12.520880, 33.835231, '-12.293361', 18.223959, 41.142450],
    'continent': ['North America', 'Asia', 'Africa', 'North America', 'Europe']
})
print(df1)

df2 = pd.DataFrame({
    'COUNTRY': ['Afghanistan', 'Albania', 'Algeria', 'American Samoa', 'Andorra'],
    'GDP (BILLIONS)': [21.71, 13.40, 227.80, 0.75, 4.80],
    'CODE': ['AFG', 'ALB', 'DZA', 'ASM', 'AND']
})
print(df2)

# merge, using 'outer' to avoid losing records from either left or right
df3 = pd.merge(left=df1, right=df2, left_on='name', right_on='COUNTRY', how='outer')
# combining the columns used to match
df3['name'] = df3.apply(lambda row: row['name'] if not pd.isnull(row['name']) else row['COUNTRY'], axis=1)
# dropping the now spare column
df3 = df3.drop('COUNTRY', axis=1)
print(df3)

相关问题 更多 >