使用第二个df更新熊猫df

时间:2017-01-10 21:05:24

标签: python-2.7 pandas

我的问题是我的数据框(df1)包含startstop列,然后是counter列。我有一个单独的数据框(df2),其中包含valuecount列。我想在df1中找到startstop包含df2的value的行,然后将df2的count添加到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

1 个答案:

答案 0 :(得分:3)

  • 使用searchsorted查找要插入的位置。
  • 这是有效的,因为您的间隔不重叠但共享一个端点。
  • 假设6进入区间[6, 7)。这由参数side='left'
  • 决定
  • 使用side='right'假设6进入间隔(5, 6]
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