gpt4 book ai didi

PYTHON - PANDAS - Groupby 更新行值

转载 作者:行者123 更新时间:2023-11-30 22:20:52 25 4
gpt4 key购买 nike

我有一个 pandas df,看起来像这样(我复制了每一行):

          START                END               
0 2018-03-02 23:56:02 2018-03-03 01:25:50
1 2018-03-03 23:44:10 2018-03-04 03:03:05
2 2018-02-05 21:57:06 2018-02-06 08:25:19
3 2018-02-06 19:30:00 2018-02-07 09:04:13
4 2018-02-07 21:51:07 2018-02-08 08:13:34
0 2018-03-02 23:56:02 2018-03-03 01:25:50
1 2018-03-03 23:44:10 2018-03-04 03:03:05
2 2018-02-05 21:57:06 2018-02-06 08:25:19
3 2018-02-06 19:30:00 2018-02-07 09:04:13
4 2018-02-07 21:51:07 2018-02-08 08:13:34

我希望你更新行看起来像这样:

          START                END               
0 2018-03-02 23:56:02 **2018-03-02 23:59:59**
1 2018-03-03 23:44:10 **2018-03-03 23:59:59**
2 2018-02-05 21:57:06 **2018-02-05 23:59:59**
3 2018-02-06 19:30:00 **2018-02-06 23:59:59**
4 2018-02-07 21:51:07 **2018-02-07 23:59:59**
0 **2018-03-03 00:00:00** 2018-03-03 01:25:50
1 **2018-03-04 00:00:00** 2018-03-04 03:03:05
2 **2018-02-06 00:00:00** 2018-02-06 08:25:19
3 **2018-02-07 00:00:00** 2018-02-07 09:04:13
4 **2018-02-08 00:00:00** 2018-02-08 08:13:34

我尝试使用带有 head 或 tail 的 groupby 但它不起作用:

df.loc[df.groupby(df.index).head(1).index, 'END'] = df.START.replace(hour=23, minute=59, second=59)
df.loc[df.groupby(df.index).tail(1).index, 'START'] = df.END.replace(hour=0, minute=0, second=0)

我想我错过了一些东西。感谢您的帮助。

最佳答案

print (df)
START END
0 2018-03-02 23:56:02 2018-03-03 01:25:50
1 2018-03-03 23:44:10 2018-03-04 03:03:05
2 2018-02-05 21:57:06 2018-02-06 08:25:19
3 2018-02-06 19:30:00 2018-02-07 09:04:13
4 2018-02-07 21:51:07 2018-02-08 08:13:34

首次使用dt.floor对于设置的开始和结束日期:

df1, df2 = df.copy(), df.copy()
df1['END'] = df1.START.dt.floor('d') + pd.Timedelta(1, unit='d') - pd.Timedelta(1, unit='s')
df2['START'] = df2.END.dt.floor('d')

最后concat :

df = pd.concat([df1,df2], ignore_index=True)
print (df)
START END
0 2018-03-02 23:56:02 2018-03-02 23:59:59
1 2018-03-03 23:44:10 2018-03-03 23:59:59
2 2018-02-05 21:57:06 2018-02-05 23:59:59
3 2018-02-06 19:30:00 2018-02-06 23:59:59
4 2018-02-07 21:51:07 2018-02-07 23:59:59
5 2018-03-03 00:00:00 2018-03-03 01:25:50
6 2018-03-04 00:00:00 2018-03-04 03:03:05
7 2018-02-06 00:00:00 2018-02-06 08:25:19
8 2018-02-07 00:00:00 2018-02-07 09:04:13
9 2018-02-08 00:00:00 2018-02-08 08:13:34

相反,floor可以使用较慢的apply + Replace:

df1['END'] = df1.START.apply(lambda x: x.replace(hour=23, minute=59, second=59))
df2['START'] = df2.END.apply(lambda x: x.replace(hour=0, minute=0, second=0))

时间:

df = pd.concat([df] * 10000, ignore_index=True)


In [242]: %%timeit
...: df1, df2 = df.copy(), df.copy()
...: df1['END'] = df1.START.dt.floor('d') + pd.Timedelta(1, unit='d') - pd.Timedelta(1, unit='s')
...: df2['START'] = df2.END.dt.floor('d')
...:
100 loops, best of 3: 19.1 ms per loop

In [243]: %%timeit
...: df1, df2 = df.copy(), df.copy()
...: df1['END'] = df1.START.apply(lambda x: x.replace(hour=23, minute=59, second=59))
...: df2['START'] = df2.END.apply(lambda x: x.replace(hour=0, minute=0, second=0))
...:
1 loop, best of 3: 534 ms per loop

关于PYTHON - PANDAS - Groupby 更新行值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48746369/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com