Pandas按时间顺序重复行
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Pandas按时间顺序重复行相关的知识,希望对你有一定的参考价值。
我正在尝试复制我的大熊猫数据框的行,并在列FROM
和TO
之间的几分钟内添加一个额外的列。
例如,我有这个数据框。
ID FROM TO
A 15:30 15:33
B 16:40 16:44
C 15:20 15:22
我希望输出是什么
ID FROM TO time
A 15:30 15:33 15:30
A 15:30 15:33 15:31
A 15:30 15:33 15:32
A 15:30 15:33 15:33
B 16:40 16:41 16:40
B 16:40 16:41 16:41
C 15:20 15:22 15:20
C 15:20 15:22 15:21
C 15:20 15:22 15:22
在R中,我可以这样做:new_df = setDT(df)[, .(ID, FROM, TO, time=seq(FROM,TO,by="mins")), by=1:nrow(df)]
,但我找不到相当于Python的Python。
先感谢您!
答案
解决问题的两个步骤:
pd.date_range
与apply
和strftime
df['duration'] = df.apply(
lambda row: [
i.strftime('%H:%M')
for i in pd.date_range(
row['FROM'], row['TO'], freq='60s'
)
],
axis=1)
ID FROM TO duration
0 A 15:30 15:33 [15:30, 15:31, 15:32, 15:33]
1 B 16:40 16:44 [16:40, 16:41, 16:42, 16:43, 16:44]
2 C 15:20 15:22 [15:20, 15:21, 15:22]
apply
与stack
df.set_index(['ID', 'FROM', 'TO'])
.duration.apply(pd.Series)
.stack().reset_index(level=3, drop=True)
.reset_index()
.set_index('ID')
# Result
FROM TO 0
ID
A 15:30 15:33 15:30
A 15:30 15:33 15:31
A 15:30 15:33 15:32
A 15:30 15:33 15:33
B 16:40 16:44 16:40
B 16:40 16:44 16:41
B 16:40 16:44 16:42
B 16:40 16:44 16:43
B 16:40 16:44 16:44
C 15:20 15:22 15:20
C 15:20 15:22 15:21
C 15:20 15:22 15:22
另一答案
这是一个类似的@chrisz使用concat
和iterrows
以及date_range
仅限于一步
df = pd.concat([pd.DataFrame({
'ID':row.ID,
'FROM': row.FROM,
'TO': row.TO,
'TIME': pd.Series(pd.date_range(row.FROM, row.TO, freq='60s').time).astype(str).str[:5]
}) for _, row in df.iterrows()])
TIME FROM ID TO
0 15:30 15:30 A 15:33
1 15:31 15:30 A 15:33
2 15:32 15:30 A 15:33
3 15:33 15:30 A 15:33
0 16:40 16:40 B 16:44
1 16:41 16:40 B 16:44
2 16:42 16:40 B 16:44
3 16:43 16:40 B 16:44
4 16:44 16:40 B 16:44
0 15:20 15:20 C 15:22
1 15:21 15:20 C 15:22
2 15:22 15:20 C 15:22
以上是关于Pandas按时间顺序重复行的主要内容,如果未能解决你的问题,请参考以下文章