Python 包含数字和字符串值的对象类型的键存在合并问题
我有两个数据帧df1和df2,如下所示:-Python 包含数字和字符串值的对象类型的键存在合并问题,python,python-3.x,pandas,dataframe,merge,Python,Python 3.x,Pandas,Dataframe,Merge,我有两个数据帧df1和df2,如下所示:- df1 = pd.DataFrame({'x': [1, '3', 5,'t','m','u'],'y':[2, 4, 6, 4, 4, 8]}) df2 = pd.DataFrame({'x': [1, 3, '4','t'],'z':[2, 4, 6,7]}) 我正在尝试合并(左连接)两个数据帧,如下所示:- df=pd.merge(df1, df2, how='left', on='x') 输出为:- df Out[25]: x
df1 = pd.DataFrame({'x': [1, '3', 5,'t','m','u'],'y':[2, 4, 6, 4, 4, 8]})
df2 = pd.DataFrame({'x': [1, 3, '4','t'],'z':[2, 4, 6,7]})
我正在尝试合并(左连接)两个数据帧,如下所示:-
df=pd.merge(df1, df2, how='left', on='x')
输出为:-
df
Out[25]:
x y z
0 1 2 2.0
1 3 4 NaN
2 5 6 NaN
3 t 4 7.0
4 m 4 NaN
5 u 8 NaN
显然,对于上面的第二行,即x=3,我希望使用z=4而不是NaN。是否有一个选项可以在合并期间定义键的数据类型,或者任何其他解决方法,在其中我可以将键的数据类型更改为两个数据帧中的字符串,并获得所需的输出。您的df1和df2,3有不同的数据类型,一个是数字,另一个是str,所以我们把它们都转换成可以匹配的字符串
df=pd.merge(df1.astype(str), df2.astype(str), how='left', on='x')
df
Out[914]:
x y z
0 1 2 2
1 3 4 4
2 5 6 NaN
3 t 4 7
4 m 4 NaN
5 u 8 NaN
您可以使用
assign
将新数据类型临时分配给x列:
pd.merge(df1.assign(x=df1.x.astype(str)),
df2.assign(x=df2.x.astype(str)),
how='left', on='x')
输出:
x y z
0 1 2 2.0
1 3 4 4.0
2 5 6 NaN
3 t 4 7.0
4 m 4 NaN
5 u 8 NaN
谢谢Scott,它工作了,这正是我在合并步骤中更改数据类型所需要的。如果col name而不是“x”表示“我的id”,请告诉我如何使用您的代码。如果这是一个愚蠢的问题,请道歉。您不能将assign与包含特殊字符或空格的列名一起使用。您需要创建一个中间数据帧,该数据类型在“我的id”上更改,或者向现有数据帧添加一个新列,将“我的id”强制转换为字符串,或者将列的名称从“我的id”更改为“我的id”,并使用assign@如果您希望将dataframe中的所有列强制转换为字符串,则Wen方法仍应有效。我的最佳建议是更改列名或创建一个新列,使您的空格为下划线,如“My_id”或“myid”,这将有效。我同意,并且我也做了完全相同的操作。它工作得很好。另外,其中一个数据帧是包含数据帧的字典键的值。早些时候,当我尝试使用astype(str)时,它抛出了一个类似SettingWithCopyWarning的警告:试图在数据帧的切片副本上设置一个值。尝试改用.loc[row\u indexer,col\u indexer]=值。有了你的建议,问题就解决了。谢谢斯科特。确实很有帮助。