我正在尝试将以下格式的时间表转换为报告格式。
目前数据存储如下:
Person Name Jun 1 Jun 2 Jun 3 Jun 4 Jun 5 Jun 6 Jun 7 Jun 8 Jun 9 Jun 10 ...
John Smith X X X X O O O X X X ...
Aaron Roberts O O X X X X O O O O ...
Jess Lewis O O O O X X X X X X ...
Edgar Blue X X X X X O O O O X ...
Lara Irvin X X O O O O X X X X ...
X 代表它们“开启”的日子,O 代表它们“关闭”的日子。
我想要的是运行一个 python 脚本,以这种格式的报告总结时间表:
Person Name From: To:
John Smith Jun 1 Jun 4
John Smith Jun 8 Jun 10
Aaron Roberts Jun 3 Jun 6
Jess Lewis Jun 5 Jun 10
Edgar Blue Jun 1 Jun 5
Edgar Blue Jun 10 Jun 13
Lara Irvin Jun 1 Jun 2
Lara Irvin Jun 7 Jun 10
我尝试的是创建一个唯一的名称列表
names = ["John Smith", "Aaron Roberts", "Jess Lewis", "Edgar Blue", "Lara Irvin"]
然后做
for name in names:
df.iloc["Person Name"] == name
然后我不知道如何继续,我试图看看 i 位置是 X 还是 O,然后看看 i-1 位置是 X 还是 O
然后...
if i == "X" && i-1 == "O"
在另一个表的“发件人:”列中填充该标题日期
还有...
if == "O" && i-1 == "X"
在另一个表的“收件人:”列中填充该标题日期
然后使用嵌套 for 循环对所有“人名”和所有日期重复相同的过程。
预先感谢您的帮助。
最佳答案
这需要cumsum
创建子组,然后我们将groupby
与agg
堆叠起来
df=df.set_index('PersonName')
s1=df.eq('O').cumsum(1).stack().reset_index()
s=s1[df.stack().ne('O').values].groupby(['PersonName',0])['level_1'].agg(['first','last']).reset_index(level=1,drop=True)
s
first last
PersonName
AaronRoberts Jun3 Jun6
EdgarBlue Jun1 Jun5
EdgarBlue Jun10 Jun10
JessLewis Jun5 Jun10
JohnSmith Jun1 Jun4
JohnSmith Jun8 Jun10
LaraIrvin Jun1 Jun2
LaraIrvin Jun7 Jun10
关于python - 使用 Python 将日程表转换为综合报告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61209145/