Python 2.7 使用第二个df更新熊猫df
我的问题是,我有一个数据帧(df1),它有一个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
开始
和停止
列,然后是一个计数器
列。我有一个单独的数据帧(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