这些问题都没有解决这个问题:Question 1和Question 2,在熊猫文档中也找不到答案。
您好,我正在尝试查找此错误的根本原因:
ValueError: You are trying to merge on object and int64 columns.
我知道我可以使用熊猫concat
或merge
函数来解决此问题,但是我试图理解错误的原因。问题是:为什么我得到这个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
列是两个数据帧中的对象之前会发生这种情况?谢谢。
答案 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
>>> df3.join(df2, on='id3')
id3 val1 id2 val2
0 1 11 NaN NaN
1 2 12 NaN NaN
答案 1 :(得分:1)
使用pandas.DataFrame.merge
。
答案 2 :(得分:0)
为什么不将str分别分配给两个必需的列,看看是否仍然存在问题。