我有 pandas 0.19.2 版本。
以下是一个示例:
testdf = pd.DataFrame({'A': [1, 2, 3, 4], 'B': [1.0, 2.0, 3.0, 4.0]})
testdf.dtypes
输出:
A int64
B float64
dtype: object
目前看起来一切都很好,但我不喜欢的是(注意,第一个调用是pd.Series.iloc
,第二个调用是pd.DataFrame.iloc
)
print(type(testdf.A.iloc[0]))
print(type(testdf.iloc[0].A))
输出:
<class 'numpy.int64'>
<class 'numpy.float64'>
在尝试理解为什么 pd.DataFrame.join()
操作返回了两个 int64
列几乎没有交集的情况时,我找到了它。我的猜测是因为类型不一致可能与此行为有关,但我不确定……我的简短调查揭示了上面的事情,现在我有点困惑。
如果有人知道如何解决它 - 我将非常感激任何提示!
更新
感谢 @EdChum 的评论。所以这里是我的生成数据和连接/合并行为的示例:
testdf.join(testdf, on='A', rsuffix='3')
A B A3 B3
0 1 1.0 2.0 2.0
1 2 2.0 3.0 3.0
2 3 3.0 4.0 4.0
3 4 4.0 NaN NaN
而下面的代码
pd.merge(left=testdf, right=testdf, on='A')
被认为是相同的,并返回
A B_x B_y
0 1 1.0 1.0
1 2 2.0 2.0
2 3 3.0 3.0
3 4 4.0 4.0
更新2: 模仿@EdChum关于join
和merge
行为的评论。 问题在于A.join(B,on ='C')
将使用A
中的索引并将其与列B [ 'C']
连接,因为默认情况下join使用索引。 在我的情况下,我只是使用了merge来获得期望的结果。
iloc
返回你的行系列,由于不存在既能满足 int 又能满足 float 的 dtype,因此显示了object
,但是如果你的行是混合类型,那么问题出在哪里呢? - EdChumjoin
会尝试在索引上进行连接,而merge
则会尝试在列上进行合并。它们在语义上是不同的,但是根据传递的参数,您可以获得相同的结果。 - EdChum