Python 如何通过比较熊猫中重叠的列来连接两个数据帧?

Python 如何通过比较熊猫中重叠的列来连接两个数据帧?,python,numpy,pandas,dataframe,Python,Numpy,Pandas,Dataframe,df1和df2是测量的两个DataFrame对象,具有各自的相对时间戳(无绝对时间)。df1['voltage']的最后一个n值是df2['voltage']的第一个n,即。E有重叠的数据n我不知道 我现在想要df3,它将df1和df2连接起来,这样就省去了冗余数据 有没有办法用熊猫来做到这一点?我已尝试查看合并 ,join和concat方法,但我没有找到任何解决问题的方法——问题似乎在于缺少一个绝对时间来比较这两个对象。一个简短的例子(通常,时间和电压是浮点数,而不是整数): df1 df2

df1
df2
是测量的两个
DataFrame
对象,具有各自的相对时间戳(无绝对时间)。
df1['voltage']
的最后一个
n
值是
df2['voltage']
的第一个
n
,即。E有重叠的数据<代码>n我不知道

我现在想要
df3
,它将
df1
df2
连接起来,这样就省去了冗余数据

有没有办法用熊猫来做到这一点?我已尝试查看
合并
join
concat
方法,但我没有找到任何解决问题的方法——问题似乎在于缺少一个绝对时间来比较这两个对象。一个简短的例子(通常,时间和电压是浮点数,而不是整数):

df1

df2

在本例中,
df1
的最后5个值出现在
df2
中。这次行动应该会有成效

df3

这感觉像是一个简单而常见的问题,但我找不到任何东西,我现在唯一的想法是沿着

for i in xrange(1, len(df1['voltage'])):
    l1 = df1['voltage'][-i:].values
    l2 = df2['voltage'][:i].values
    if np.allclose(l1, l2):
        n = i
然后使用
concat
。这是极其缓慢的(特别是因为在找到一个匹配项后,我无法
中断
;以后可能还会有其他匹配项)


在熊猫身上有没有一种快速(最好是简单)的方法

这充满了危险,您没有唯一的方法来确定当您的时间值在两个df中发生冲突时哪些值重叠,如果您确信这是正确的,您可以尝试确定一个值范围是否匹配,然后计算剩余值,但df1中的一个小范围与df2重叠,并且我认为没有一个合理的方法不会覆盖或丢失数据中的值merge@EdChum这就是我害怕的。不幸的是,我无法从我的文件中获得唯一的时间戳(甚至在测量后用一个时间戳保存它们)。就我理解这个问题的程度而言,我认为你的方法是正确的,尽管我不明白为什么在找到匹配项后你不能退出循环。我认为可能有空间对循环进行优化。特别是,在numpy中执行所有操作,确保只创建一次
l1
l2
,然后将视图与它们进行比较(而不是像现在这样重复复制)。我刚刚在问题中添加了一个numpy标签,顺便说一句@JohnE with
l1=[1,4,5,4,5];l2=[4,5,4,5,6]
我的方法产生n=2和n=4,其中4是期望的结果。感谢您提示何时创建
l1
l2
;这很有道理,而且代码速度更快。我明白了。在这种情况下,为什么不从n到1,而不是从1到n呢?然后你可以在第一场比赛后退出,对吗?这充满了危险,你没有办法唯一地确定哪些值重叠,因为你的时间值在两个df中发生冲突,如果您确信这是正确的,您可以尝试确定一个值范围是否匹配,然后计算剩余值,但df1中的一个小范围与df2重叠,并且我认为没有一个合理的方法不会覆盖或丢失数据中的值merge@EdChum这就是我害怕的。不幸的是,我无法从我的文件中获得唯一的时间戳(甚至在测量后用一个时间戳保存它们)。就我理解这个问题的程度而言,我认为你的方法是正确的,尽管我不明白为什么在找到匹配项后你不能退出循环。我认为可能有空间对循环进行优化。特别是,在numpy中执行所有操作,确保只创建一次
l1
l2
,然后将视图与它们进行比较(而不是像现在这样重复复制)。我刚刚在问题中添加了一个numpy标签,顺便说一句@JohnE with
l1=[1,4,5,4,5];l2=[4,5,4,5,6]
我的方法产生n=2和n=4,其中4是期望的结果。感谢您提示何时创建
l1
l2
;这很有道理,而且代码速度更快。我明白了。在这种情况下,为什么不从n到1,而不是从1到n呢?然后你可以在第一场比赛后退出,对吗?这充满了危险,你没有办法唯一地确定哪些值重叠,因为你的时间值在两个df中发生冲突,如果您确信这是正确的,您可以尝试确定一个值范围是否匹配,然后计算剩余值,但df1中的一个小范围与df2重叠,并且我认为没有一个合理的方法不会覆盖或丢失数据中的值merge@EdChum这就是我害怕的。不幸的是,我无法从我的文件中获得唯一的时间戳(甚至在测量后用一个时间戳保存它们)。就我理解这个问题的程度而言,我认为你的方法是正确的,尽管我不明白为什么在找到匹配项后你不能退出循环。我认为可能有空间对循环进行优化。特别是,在numpy中执行所有操作,确保只创建一次
l1
l2
,然后将视图与它们进行比较(而不是像现在这样重复复制)。我刚刚在问题中添加了一个numpy标签,顺便说一句@JohnE with
l1=[1,4,5,4,5];l2=[4,5,4,5,6]
我的方法产生n=2和n=4,其中4是期望的结果。感谢您提示何时创建
l1
l2
;这很有道理,而且代码速度更快。我明白了。在这种情况下,为什么不从n到1,而不是从1到n呢?那么你可以在第一场比赛后退出,对吗?
      name          value          dim         time          voltage
       abc            000            s            0                7
       ghi            001            m            1                6
       NaN            NaN          NaN            2                7
       NaN            NaN          NaN            3                7
       NaN            NaN          NaN            4                6
       NaN            NaN          NaN            5                4
       NaN            NaN          NaN            6                2
       NaN            NaN          NaN            7                6
       NaN            NaN          NaN            8                7
       NaN            NaN          NaN            9                7
      name          value          dim         time          voltage
       abc            000            s            0                5
       def            001            m            1                6
       NaN            NaN          NaN            2                5
       NaN            NaN          NaN            3                6
       NaN            NaN          NaN            4                7
       NaN            NaN          NaN            5                7
       NaN            NaN          NaN            6                6
       NaN            NaN          NaN            7                7
       NaN            NaN          NaN            8                7
       NaN            NaN          NaN            9                6
       NaN            NaN          NaN           10                4
       NaN            NaN          NaN           11                2
       NaN            NaN          NaN           12                6
       NaN            NaN          NaN           13                7
       NaN            NaN          NaN           14                7
for i in xrange(1, len(df1['voltage'])):
    l1 = df1['voltage'][-i:].values
    l2 = df2['voltage'][:i].values
    if np.allclose(l1, l2):
        n = i