首页 > 解决方案 > 如何在 pandas 的列上合并 2 个数据框

问题描述

我在合并熊猫中的两个数据框时遇到问题。它们是在两个文件之间拆分的数据集的一部分,它们共享一些列和值,即“名称”和“地址”。具有相同值的条目不与另一个文件中的条目共享它们的索引。我尝试了以下行的变体:

res = pd.merge(df, df_p, on=['name', 'address'], how="left")

当 how 参数设置为“左”时,来自 df_p 的列没有值。'right' 有相反的效果,df 的列是空的。'inner' 导致一个空的数据框,'outer' 复制了条目的数量,本质上只是附加了 'left' 和 'right' 的结果。

我手动验证了两个文件中的“名称”和“地址”值的组合相同。

编辑:尝试合并其中一个列似乎是成功的,但是我想避免合并不正确的条目,以防两个同名的人有不同的地址,反之亦然

Edit1:这里有一些关于数据集的更多信息。

df.info() 输出:

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 3983 entries, 0 to 3982
Data columns (total 23 columns):
 #   Column            Non-Null Count  Dtype  
---  ------            --------------  -----  
 0   Unnamed: 0        3983 non-null   int64  
 1   name              3983 non-null   object 
 2   address           3983 non-null   object 
 3   race              3970 non-null   object 
 4   marital-status    3967 non-null   object 
 5   occupation        3971 non-null   object 
 6   pregnant          3969 non-null   object 
 7   education-num     3965 non-null   float64
 8   relationship      3968 non-null   object 
 9   skewness_glucose  3972 non-null   float64
 10  mean_glucose      3572 non-null   float64
 11  capital-gain      3972 non-null   float64
 12  kurtosis_glucose  3970 non-null   float64
 13  education         3968 non-null   object 
 14  fnlwgt            3968 non-null   float64
 15  class             3969 non-null   float64
 16  std_glucose       3965 non-null   float64
 17  income            3974 non-null   object 
 18  medical_info      3968 non-null   object 
 19  native-country    3711 non-null   object 
 20  hours-per-week    3971 non-null   float64
 21  capital-loss      3969 non-null   float64
 22  workclass         3968 non-null   object 
dtypes: float64(10), int64(1), object(12)
memory usage: 715.8+ KB

来自 df 的示例条目:

0,Curtis Brown,"32266 Byrd Island
Fowlertown, DC 84201", White, Married-civ-spouse, Exec-managerial,f,9.0, Husband,1.904881822,79.484375,15024.0,0.667177618, HS-grad,147707.0,0.0,39.49544760000001, >50K,"{'mean_oxygen':'1.501672241','std_oxygen':'13.33605383','kurtosis_oxygen':'11.36579476','skewness_oxygen':'156.77910559999995'}", United-States,60.0,0.0, Private

df_p.info() 输出:

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 3933 entries, 0 to 3932
Data columns (total 6 columns):
 #   Column         Non-Null Count  Dtype 
---  ------         --------------  ----- 
 0   Unnamed: 0     3933 non-null   int64 
 1   name           3933 non-null   object
 2   address        3933 non-null   object
 3   age            3933 non-null   int64 
 4   sex            3933 non-null   object
 5   date_of_birth  3933 non-null   object
dtypes: int64(2), object(4)
memory usage: 184.5+ KB

来自 df_p 的示例条目:

2273,Curtis Brown,"32266 Byrd Island
Fowlertown, DC 84201",44, Male,1975-03-26

如您所见,所选样本是针对同一个人的,但它们的索引不匹配,这就是我尝试使用名称和地址列的原因。

Edit2:在合并中更改 df 和 df_p 的顺序似乎已经解决了这个问题,尽管我不知道为什么。

标签: pythonpandasdataframemerge

解决方案


推荐阅读