df.join()出现问题:ValueError:您正在尝试合并对象和int64列

时间:2019-09-04 20:43:52

标签: python pandas dataframe join

  

这些问题都没有解决这个问题:Question 1Question 2,在熊猫文档中也找不到答案。

您好,我正在尝试查找此错误的根本原因:

ValueError: You are trying to merge on object and int64 columns.

我知道我可以使用熊猫concatmerge函数来解决此问题,但是我试图理解错误的原因。问题是:为什么我得到这个ValueError

这是两个使用的数据帧上的head(5)info()的输出。

print(the_big_df.head(5))输出:

  account  apt  apt_p  balance       date  day    flag  month  reps     reqid  year
0  AA0420    0    0.0  -578.30 2019-03-01    1       1      3    10  82f2d761  2019
1  AA0420    0    0.1  -578.30 2019-03-02    2       1      3    10  82f2d761  2019
2  AA0420    0    0.1  -578.30 2019-03-03    3       1      3    10  82f2d761  2019
3  AA0421    0    0.1  -607.30 2019-03-04    4       1      3    10  82f2d761  2019
4  AA0421    0    0.1  -610.21 2019-03-05    5       1      3    10  82f2d761  2019

print(the_big_df.info())输出:

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 36054 entries, 0 to 36053
Data columns (total 11 columns):
account        36054 non-null object
apt            36054 non-null int64
apt_p          36054 non-null float64
balance        36054 non-null float64
date           36054 non-null datetime64[ns]
day            36054 non-null int64
flag           36054 non-null int64
month          36054 non-null int64
reps           36054 non-null int32
reqid          36054 non-null object
year           36054 non-null int64
dtypes: datetime64[ns](1), float64(2), int32(1), int64(5), object(2)
memory usage: 3.2+ MB

这是我要传递给join()的数据帧; print(df_to_join.head(5))

      reqid     id
0  54580f39  13301
1  3ba905c0  77114
2  5f2d80da  13302
3  a1478e98  77115
4  9b09854b  78598

print(df_to_join.info())输出:

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 14332 entries, 0 to 14331
Data columns (total 2 columns):
reqid    14332 non-null object
dni      14332 non-null object

上述4张照片之后的确切下一行是:

the_max_df = the_big_df.join(df_to_join,on='reqid')

输出如上所述,

ValueError: You are trying to merge on object and int64 columns. If you wish to proceed you should use pd.concat

为什么在明确声明reqid列是两个数据帧中的对象之前会发生这种情况?谢谢。

3 个答案:

答案 0 :(得分:3)

这里的问题是对连接的工作方式有一个误解:当您说the_big_df.join(df_to_join,on='reqid')时,并不意味着加入the_big_df.reqid == df_to_join.reqid,就像一个人会乍一看,而是加入the_big_df.reqid == df_to_join.index。由于requid的类型为object,索引的类型为int64,因此会出现错误。

请参见docs for join

  

在索引或键列上将列与其他DataFrame连接起来。
  ...
  打开:str,str列表或类似数组的可选
  调用方中的列或索引级别名称要与其他索引中的索引名称联接,否则就联接index-on-index。

看下面的例子:

df1 = pd.DataFrame({'id1': [1, 2], 'val1': [11,12]})
df2 = pd.DataFrame({'id2': [3, 4], 'val2': [21,22]})
print(df1)
#   id1  val1
#0    1    11
#1    2    12
print(df2)
#   id2  val2
#0    3    21
#1    4    22

# join on df1.id1 (int64) == df2.index (int64) 
print(df1.join(df2, on='id1'))
#   id1  val1  id2  val2
#0    1    11  4.0  22.0
#1    2    12  NaN   NaN

# now df3 same as df1 but id3 as object:
df3 = pd.DataFrame({'id3': ['1', '2'], 'val1': [11,12]})

# try to join on df3.id3 (object) == df2.index (int64) 
df3.join(df2, on='id3')
#ValueError: You are trying to merge on object and int64 columns. If you wish to proceed you should use pd.concat


请注意:以上是现代版本的熊猫。 20.3版给出了以下结果:

>>> df3.join(df2, on='id3')
  id3  val1  id2  val2
0   1    11  NaN   NaN
1   2    12  NaN   NaN

答案 1 :(得分:1)

使用pandas.DataFrame.merge

docs for merge

答案 2 :(得分:0)

为什么不将str分别分配给两个必需的列,看看是否仍然存在问题。