Python 3.x 在dataframe中插入接下来10个工作日的行

Python 3.x 在dataframe中插入接下来10个工作日的行,python-3.x,pandas,dataframe,datetime,Python 3.x,Pandas,Dataframe,Datetime,df有三列-日期,名称,和数量。对于每个name和date组合,我想插入n行,以便name在下一个n行中重复,但date增加1个工作日,如果name和date组合中不存在,则quaty=nandf >>> import pandas as pd >>> from datetime import datetime >>> df = pd.DataFrame({'name':['abd']*3 + ['pqr']*2 + ['xyz']*1, '

df
有三列-
日期
名称
,和
数量
。对于每个
name
date
组合,我想插入
n
行,以便
name
在下一个
n
行中重复,但
date
增加1个工作日,如果
name
date
组合中不存在,则
quaty=nan
df

>>> import pandas as pd
>>> from datetime import datetime
>>> df = pd.DataFrame({'name':['abd']*3 + ['pqr']*2 + ['xyz']*1, 'date':[datetime(2020,1,6), datetime(2020,1,8), datetime(2020,2,5), datetime(2017,10,4), datetime(2017,10,13), datetime(2013,5,27)], 'qty':range(6)})
>>> df
  name       date  qty
0  abd 2020-01-06   10
1  abd 2020-01-08    1
2  abd 2020-02-05    2
3  pqr 2017-10-04    3
4  pqr 2017-10-13    4
5  xyz 2013-05-27    5
我不知道该怎么办。任何想法/线索。非常感谢

n=3的所需输出

   name       date  qty
0   abd 2020-01-06   10
1   abd 2020-01-07  nan
2   abd 2020-01-08    1
3   abd 2020-01-09  nan
4   abd 2020-01-10  nan
5   abd 2020-01-13  nan
6   abd 2020-02-05    2
7   abd 2020-02-08  nan
8   abd 2020-02-09  nan
9   abd 2020-02-10  nan
10  pqr 2017-10-04    3
11  pqr 2017-10-05  nan
12  pqr 2017-10-06  nan
13  pqr 2017-10-09  nan
14  pqr 2017-10-13    4
15  pqr 2017-10-16  nan
16  pqr 2017-10-17  nan
17  pqr 2017-10-18  nan
18  xyz 2013-05-27    5
19  xyz 2013-05-28  nan
20  xyz 2013-05-29  nan
21  xyz 2013-05-30  nan
这里有一个方法:

from functools import reduce

n = 3
new_index = (
    df.groupby("name")
    .apply(
        lambda x: reduce(
            lambda i, j: i.union(j),
            [pd.bdate_range(i, periods=n + 1) for i in x["date"]],
        )
    )
    .explode()
)
midx = pd.MultiIndex.from_frame(new_index.reset_index(), names=["name", "date"])
df_out = df.set_index(["name", "date"]).reindex(midx).reset_index()
df_out
如果
爆炸
无法使用:

from functools import reduce

n = 3
new_index = (
    df.groupby("name")
    .apply(
        lambda x: reduce(
            lambda i, j: i.union(j),
            [pd.bdate_range(i, periods=n + 1) for i in x["date"]],
        )
    )
    .apply(pd.Series)
    .stack()
    .reset_index(level=0)
    .rename(columns={0:'date'})
)
df_out = new_index.merge(df, how='left', on=['name', 'date'])
df_out
输出:

   name       date  qty
0   abd 2020-01-06  0.0
1   abd 2020-01-07  NaN
2   abd 2020-01-08  1.0
3   abd 2020-01-09  NaN
4   abd 2020-01-10  NaN
5   abd 2020-01-13  NaN
6   abd 2020-02-05  2.0
7   abd 2020-02-06  NaN
8   abd 2020-02-07  NaN
9   abd 2020-02-10  NaN
10  pqr 2017-10-04  3.0
11  pqr 2017-10-05  NaN
12  pqr 2017-10-06  NaN
13  pqr 2017-10-09  NaN
14  pqr 2017-10-13  4.0
15  pqr 2017-10-16  NaN
16  pqr 2017-10-17  NaN
17  pqr 2017-10-18  NaN
18  xyz 2013-05-27  5.0
19  xyz 2013-05-28  NaN
20  xyz 2013-05-29  NaN
21  xyz 2013-05-30  NaN
工作原理:


首先从functools导入reduce,用于创建单个日期列表。日期列表是从中创建的,每个名称在groupby中。使用将新索引和名称列表转换为多索引。在原始数据框上设置索引后使用
reindex

你能用这些数据显示你的预期输出吗?谢谢你的评论@ScottBoston。我为
n=3
添加了所需的输出,它为我提供了
AttributeError:“Series”对象没有属性“explode”
。这可能是版本错误-有没有办法在不升级版本的情况下绕过它?是的,这更可能是版本问题。让我们看看是否可以以不同的方式“分解”该列表。我们可以尝试其中一种。