Python 包含数字和字符串值的对象类型的键存在合并问题

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和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  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]=值。有了你的建议,问题就解决了。谢谢斯科特。确实很有帮助。