Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为另一列中的每个值生成相同长度的行(使用Python或SQL)_Python_Sql_Pandas - Fatal编程技术网

为另一列中的每个值生成相同长度的行(使用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