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”
。这可能是版本错误-有没有办法在不升级版本的情况下绕过它?是的,这更可能是版本问题。让我们看看是否可以以不同的方式“分解”该列表。我们可以尝试其中一种。