【问题标题】:Pandas: joining two tables on datetime datetime64[ns] fails熊猫:在 datetime datetime64[ns] 上加入两个表失败
【发布时间】:2019-05-04 14:31:00
【问题描述】:

有谁知道为什么加入datetime64[ns] 不起作用,而如果将这些相同的列设置为索引则它确实起作用?这真的很奇怪,感觉像一个错误或者有什么解释吗?

df1 = pd.DataFrame({
    "a": [1,2,3],
    "t": pd.to_datetime([1556979766, 1556979767, 1556979768], unit="s")
})
df2 = pd.DataFrame({
    "b": [5,3,3],
    "t": pd.to_datetime([1556979766, 1556979767, 1556979768], unit="s")
})
df1.join(df2, on="t")

>> ValueError: You are trying to merge on datetime64[ns] and int64 columns. If you wish to proceed you should use pd.concat

虽然这有效:

df1.index = df1.t
df2.index = df2.t
df1.join(df2, lsuffix="1")

dtypes 相同

list(df1.dtypes) == list(df2.dtypes)
>> True

(熊猫版:'0.24.2'

【问题讨论】:

  • 你试过df1.merge(df2, how='inner', on='t')吗?
  • @aws_apprentice 一样,我认为方法无关紧要,因为它会首先评估导致错误的语句!
  • @meow:我认为这只是join 的工作方式:on 参数仅指 caller DataFrame。以下是关于on 的文档:调用者 中的列或索引级别名称加入其他 中的索引,否则加入索引上的索引。所以它试图通过df1t列和df2的索引加入,导致类型不匹配
  • pd.merge(df1, df2, on='t') 应该在这里工作
  • @perl 谢谢这是有道理的,我假设它会在两个数据帧的指定列上加入它。

标签: python pandas join python-3.7


【解决方案1】:

正如@perl 建议的那样,df1.join(df2, on='t') 将尝试将df1.t 匹配到df2.index,在本例中为int64。另一种解决方法是

df1.join(df2.set_index('t'), on='t')

或使用merge。您可以在其中指定要在两侧使用的列。

df1.merge(df2, left_on='t', right_on='t')

【讨论】:

    猜你喜欢
    • 2019-06-24
    • 1970-01-01
    • 2016-11-19
    • 1970-01-01
    • 2021-02-19
    • 2019-01-20
    • 2020-11-05
    • 2016-05-17
    • 2021-10-09
    相关资源
    最近更新 更多