使用python中的两个数字合并或连接两个数据集
Posted
技术标签:
【中文标题】使用python中的两个数字合并或连接两个数据集【英文标题】:Merge or join two datasets using between two numbers in python 【发布时间】:2021-07-09 08:43:30 【问题描述】:我有两个数据集;
尝试在 df1(查看的数据)上合并 df2(内容数据)。必须使用合并。但是,key 不是标准的,应该是 between 键。
df1 = pd.DataFrame("ID": [1, 2],"start":[7200, 1000],"end":[7400, 1100],"duration":[200, 100])
df2 = pd.DataFrame("Prog_start":[7100,7300,980,1050],"Prog_end":[7300,7400,1050,1150],"Prog":["Prog_1","Prog_2","Prog_3","Prog_4"])
desired_output=pd.DataFrame("ID":[1,1,2,2],"start":[7200,7200,1000,1000],"end":[7400,7400,1100,1100],"duration":[200,200,100,100],"Prog_start":[7100,7300,980,1050],"Prog_end":[7300,7400,1050,1150],"Prog":["Prog_1","Prog_2","Prog_3","Prog_4"],"Dur_Prog":[100,100,20,50])
我尝试过使用 iloc 以及在不起作用的函数之间。
【问题讨论】:
你能解释一下合并背后的逻辑吗? 我得到了节目开启和关闭的收视率数据。这些是程序的开始时间和结束时间。在另一个数据集中,我得到了人们在观看的时间内播放了哪些节目。 【参考方案1】:您可以取df1
和df2
的笛卡尔积,然后只过滤重叠区间,然后计算持续时间:
# cartesian product and interval filtering
z = (df1
.assign(k=1).merge(df2.assign(k=1), on='k')
.query('(Prog_start < end) & (Prog_end > start)')
.drop(columns='k'))
# duration calculation
z['Duration_Prog'] = (np.clip(z['Prog_end'], z['start'], z['end']) -
np.clip(z['Prog_start'], z['start'], z['end']))
z
输出:
ID start end duration Prog_start Prog_end Prog Duration_Prog
0 1 7200 7400 200 7100 7300 Prog_1 100
1 1 7200 7400 200 7300 7400 Prog_2 100
6 2 1000 1100 100 980 1050 Prog_3 50
7 2 1000 1100 100 1050 1150 Prog_4 50
附:您的desired_output
的第 3 行有错误吗?如果我理解正确的逻辑应该是Duration_Prog = 50
(重叠是1000 - 1050
)
附言使用较新的 pandas
(1.2.0+),您可以使用 merge
和 how='cross'
进行笛卡尔连接,不需要临时的 k
列
【讨论】:
你是对的。有一个错误。它应该是 50 in Row。你提到的逻辑看起来很完美。但是,我收到一个错误,“您正在尝试合并 int64 和对象列。如果您希望继续,您应该使用 pd.concat”。我看了看Dtypes。两个数据集中的两列都是 int64 您可能在df1
和 df2
中有一些其他列重叠。尝试在merge
中设置on='k'
:.assign(k=1).merge(df2.assign(k=1), on='k')
在我的回答中更新了
是的。它现在起作用了。谢谢你。它就像一个魅力。我将尝试解决 how='cross' 加入。
太棒了!回复how='cross'
,你可以直接df1.merge(df2, how='cross')
,以后不需要drop(columns='k')
,所以更简洁,但它只适用于pandas
1.2.0+版本以上是关于使用python中的两个数字合并或连接两个数据集的主要内容,如果未能解决你的问题,请参考以下文章
Python:两个数据帧的外部连接或合并给出错误:TypeError:unhashable type:'numpy.ndarray'
Python使用pandas读取两个或者多个excel文件(xlsx)并进行数据连接(join)合并两个或者多个excel的信息