Python 2.7 使用第二个df更新熊猫df

Python 2.7 使用第二个df更新熊猫df,python-2.7,pandas,Python 2.7,Pandas,我的问题是,我有一个数据帧(df1),它有一个开始和停止列,然后是一个计数器列。我有一个单独的数据帧(df2),它有一个值和一个计数列。我想在df1中找到其开始和停止包含df2的值的行,然后将df2的计数添加到df1中。这两个数据帧将具有不同的行,并且不会排序 我已经编写了一个循环,通过df2逐行循环,但是它太慢了,所以我想知道是否有一种类型的连接或合并我可以做。谢谢你的帮助 import pandas as pd df1 = pd.DataFrame() df1['start'] = ran

我的问题是,我有一个数据帧(df1),它有一个
开始
停止
列,然后是一个
计数器
列。我有一个单独的数据帧(df2),它有一个
和一个
计数
列。我想在df1中找到其
开始
停止
包含df2的
的行,然后将df2的
计数
添加到df1中。这两个数据帧将具有不同的行,并且不会排序

我已经编写了一个循环,通过df2逐行循环,但是它太慢了,所以我想知道是否有一种类型的连接或合并我可以做。谢谢你的帮助

import pandas as pd

df1 = pd.DataFrame()
df1['start'] = range(1,11)
df1['stop'] = range(2,12)
df1['count'] = [0]*10
#df1:
#   start  stop  count
#0      1     2      0
#1      2     3      0
#2      3     4      0
#3      4     5      0
#4      5     6      0
#5      6     7      0
#6      7     8      0
#7      8     9      0
#8      9    10      0
#9     10    11      0


df2 = pd.DataFrame()
df2['count'] = range(21,26)
df2['value'] = [x + 0.5 for x in range(1,6)]
#df2:
#   count  value
#0     21    1.5
#1     22    2.5
#2     23    3.5
#3     24    4.5
#4     25    5.5

#Line below doesn't work, throws:
#ValueError: Can only compare identically-labeled Series objects
df1[df2[(df1.start < df2.value) & (df2.value < df1.stop)], 'count'] += df2.count

#desired update of df1:
#   start  stop  count
#0      1     2     21
#1      2     3     22
#2      3     4     23
#3      4     5     24
#4      5     6     25
#5      6     7      0
#6      7     8      0
#7      8     9      0
#8      9    10      0
#9     10    11      0
将熊猫作为pd导入
df1=pd.DataFrame()
df1['start']=范围(1,11)
df1['stop']=范围(2,12)
df1['count']=[0]*10
#df1:
#起止点计数
#0      1     2      0
#1      2     3      0
#2      3     4      0
#3      4     5      0
#4      5     6      0
#5      6     7      0
#6      7     8      0
#7      8     9      0
#8      9    10      0
#9     10    11      0
df2=pd.DataFrame()
df2['count']=范围(21,26)
df2['value']=[x+0.5表示范围(1,6)内的x]
#df2:
#计数值
#0     21    1.5
#1     22    2.5
#2     23    3.5
#3     24    4.5
#4     25    5.5
#下面的行不起作用,抛出:
#ValueError:只能比较标签相同的系列对象
df1[df2[(df1.start
  • 使用
    searchsorted
    查找要插入的位置
  • 这是因为间隔不重叠,而是共享一个端点
  • 它将假定
    6
    进入区间
    [6,7)
    。这由参数
    side='left'
  • 使用
    side='right'
    假设
    6
    进入区间
    (5,6)


您的间隔是否总是长度为1?如果是这样,您可以在df2的值列上使用np.floor(),然后在df1.start=d2.value上合并2个数据帧。然后您可以按开始计数和总和计数进行分组。它们并不总是长度为1。您可以始终合并表,然后使用apply更新计数列。
df1.loc[
    df1.index[df1.start.searchsorted(df2.value) - 1],
    'count'
] += df2['count'].values

   start  stop  count
0      1     2     21
1      2     3     22
2      3     4     23
3      4     5     24
4      5     6     25
5      6     7      0
6      7     8      0
7      8     9      0
8      9    10      0
9     10    11      0