为另一列中的每个值生成相同长度的行(使用Python或SQL)
我在表格中的原始数据按以下格式组织:为另一列中的每个值生成相同长度的行(使用Python或SQL),python,sql,pandas,Python,Sql,Pandas,我在表格中的原始数据按以下格式组织: routes demand days Paris-New York 1 Paris-New York 3 Paris-New York 5 London-Berlin 2 London-Berlin 3 London-Berlin 4 London-Berlin 5 Tokyo-Shanghai 2 Tokyo-Shanghai 4 新表中所需的格式: routes
routes demand days
Paris-New York 1
Paris-New York 3
Paris-New York 5
London-Berlin 2
London-Berlin 3
London-Berlin 4
London-Berlin 5
Tokyo-Shanghai 2
Tokyo-Shanghai 4
新表中所需的格式:
routes calendar days demand-days
Paris-New York 1 1
Paris-New York 2
Paris-New York 3 3
Paris-New York 4
Paris-New York 5 5
London-Berlin 1
London-Berlin 2 2
London-Berlin 3 3
London-Berlin 4 4
London-Berlin 5 5
Tokyo-Shanghai 1
Tokyo-Shanghai 2 2
Tokyo-Shanghai 3
Tokyo-Shanghai 4 4
Tokyo-Shanghai 5
我只想为列routes中的每个唯一routes生成一个新列,例如日历日,该列的行数相等。有没有一种简单的方法可以使用Python或SQL来实现这一点?首先对routes和demand_days进行交叉乘积,以获得所有routes的所有可能组合all demand days。将需求日重命名为日历日。我们把结果称为A 然后,将外部数据集与初始数据集按需_天=日历_天合并。如果每条路线都是唯一的按需日,则此解决方案有效: 编辑: 按范围重新索引的动态解决方案:
我的解决方案提供了创建临时表的功能
CREATE TABLE mytable
(`routes` varchar(14), `demand_days` int)
;
INSERT INTO mytable
(`routes`, `demand_days`)
VALUES
('Paris-New York', 1),
('Paris-New York', 3),
('Paris-New York', 5),
('London-Berlin', 2),
('London-Berlin', 3),
('London-Berlin', 4),
('London-Berlin', 5),
('Tokyo-Shanghai', 2),
('Tokyo-Shanghai', 4)
;
create table t1 (val int);
insert into t1 (val) values(1),(2),(3),(4),(5);
主查询-
select distinct routes,val,(select demand_days from mytable where routes=m1.routes and demand_days=t1.val )
from mytable m1 right join t1
on m1.demand_days=t1.val
union
select distinct routes,val ,(select demand_days from mytable where routes=m1.routes and demand_days=t1.val )
from mytable m1 right join t1
on m1.demand_days<>t1.val
order by 1,2
我所做的是使用新表与您的表连接,以获得常见和不常见的需求日 实际上,我希望“日历日”是从最小值(例如,最小需求日为45天)到最大值(例如,最大需求日为365天)的连续累积。i、 e.步长=1@Jack-不确定是否理解,是否可以使用预期输出更改答案?我希望所有路线的“日历日”都是连续的,如1-365。我的实际数据中的最小需求日为41,最大需求日为151。因此,我需要每个路线的“日历日”为41-151行,以便可以像您的示例一样在“日历日”和“需求日”之间进行映射。@Jack-欢迎您!如果我的答案有帮助,别忘了——点击答案旁边的复选标记,将其从灰色变为填充。谢谢。@Jack-若要将答案标记为已接受,请单击答案旁边的复选标记,将其从空心切换为绿色。非常感谢。
CREATE TABLE mytable
(`routes` varchar(14), `demand_days` int)
;
INSERT INTO mytable
(`routes`, `demand_days`)
VALUES
('Paris-New York', 1),
('Paris-New York', 3),
('Paris-New York', 5),
('London-Berlin', 2),
('London-Berlin', 3),
('London-Berlin', 4),
('London-Berlin', 5),
('Tokyo-Shanghai', 2),
('Tokyo-Shanghai', 4)
;
create table t1 (val int);
insert into t1 (val) values(1),(2),(3),(4),(5);
select distinct routes,val,(select demand_days from mytable where routes=m1.routes and demand_days=t1.val )
from mytable m1 right join t1
on m1.demand_days=t1.val
union
select distinct routes,val ,(select demand_days from mytable where routes=m1.routes and demand_days=t1.val )
from mytable m1 right join t1
on m1.demand_days<>t1.val
order by 1,2