使用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】:

您可以取df1df2 的笛卡尔积,然后只过滤重叠区间,然后计算持续时间:

# 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+),您可以使用 mergehow='cross' 进行笛卡尔连接,不需要临时的 k

【讨论】:

你是对的。有一个错误。它应该是 50 in Row。你提到的逻辑看起来很完美。但是,我收到一个错误,“您正在尝试合并 int64 和对象列。如果您希望继续,您应该使用 pd.concat”。我看了看Dtypes。两个数据集中的两列都是 int64 您可能在 df1df2 中有一些其他列重叠。尝试在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中合并或连接两个midi文件

使用 pandas 追加、连接、连接或合并两个数据框

python将两个文件夹合并在一起

Python使用pandas读取两个或者多个excel文件(xlsx)并进行数据连接(join)合并两个或者多个excel的信息

Python通过内连接合并Pandas数据集有两个字段