python - 熊猫 - 每天的日期范围的总和值
问题描述
我有一个项目进度表中的 DataFrame:
Task Start End Staff
Task 1 2020-1-1 2020-1-4 11
Task 2 2020-1-2 2020-1-4 12
Task 3 2020-1-4 2020-1-6 2
...
期望的输出:
day staff
2020-1-1 11
2020-1-2 23
2020-1-3 23
2020-1-4 25
2020-1-5 14
到目前为止,我正在使用.iterrows()
完整的 df。
day = timedelta(days=1)
new_rows = []
for index, row in df.iterrows():
start = row.Start
while start <= row.End:
newrow = row.copy()
newrow['day'] = start
new_rows.append(newrow.values)
start += day
df_staff = pd.DataFrame(new_rows, columns= newrow.index).reset_index()
效果很好,只是想知道是否有更好/更快的方法。现在,我的 df 有 10 000 行,但可以扩展。
有什么建议么?
解决方案
这里总是需要循环,因为使用每行的范围。一种可能的解决方案是DataFrame.itertuples
使用concat
and sum
:
df1 = (pd.concat([pd.Series(r.Staff,pd.date_range(r.Start, r.End))
for r in df.itertuples()])
.sum(level=0)
.rename_axis('day')
.reset_index(name='staff'))
print (df1)
day staff
0 2020-01-01 11
1 2020-01-02 23
2 2020-01-03 23
3 2020-01-04 25
4 2020-01-05 2
5 2020-01-06 2
列表理解的另一个解决方案:
zipped = zip(df.Start, df.End, df.Staff)
df1 = (pd.DataFrame([(x, v) for s, e, v in zipped for x in pd.date_range(s, e)],
columns=['day','staff'])
.groupby('day', as_index=False)['staff'].sum())
print (df1)
day staff
0 2020-01-01 11
1 2020-01-02 23
2 2020-01-03 23
3 2020-01-04 25
4 2020-01-05 2
5 2020-01-06 2
推荐阅读
- javascript - Xeditable 日期输入配置以接受 1970 年之前的日期
- sql - 如何在列中带上对应的数据
- highcharts - 如何在 HighCharts 中删除和添加绘图线
- database - 使用 EF 在 mvc 5 项目中添加第二个数据库
- java - 无法创建 ViewModel 类的实例
- ubuntu - 11Gb 磁盘上的 2 个 10Gb 分区 (Ubuntu 20)
- python-3.x - Windows和Linux上的tkinter动画速度
- sql - 在 SQL 中加载 csv 时添加列
- memory - 沙盒和软件故障隔离到底是什么意思?
- seo - nuxt meta robots 在生产模式下设置为 noindex