如何解决使用Pandas,如何将一个系列的所有重复元素与另一个系列的元素相减?
arr_time dep_time station
0 19:20:00 19:20:00 a
1 19:38:00 19:45:00 b
2 18:55:00 19:00:00 a
3 19:40:00 19:45:00 a
4 19:50:00 19:55:00 b
.
.
我需要做的是: 对于工作站中的每个相同项目,请减去 dep_time 中的相关项目以及 arr_time 中的每个相关项目(不考虑同一项目)。例如: 对于工作站 a :
for i in range(len(arr_time)):
for j in range(len(dep_time)):
if i != j:
dep_time[j] - arr_time[i]
对于工作站 a ,结果必须为:
result
-00:20:00
00:25:00
,依此类推,对于 station 中的所有工作站。 由于数据量大,需要用Pandas编写。我将非常感谢任何能帮助我的人!
解决方法
这是一种方法。我使用pd.merge
将每个站“ a”链接到其他每个站“ a”(等等)。然后我进行了过滤,因此我们不会将测站与其自身进行比较,而是执行时间算法。
from io import StringIO
import pandas as pd
data = ''' arr_time dep_time station
0 19:20:00 19:20:00 a
1 19:38:00 19:45:00 b
2 18:55:00 19:00:00 a
3 19:40:00 19:45:00 a
4 19:50:00 19:55:00 b
'''
df = pd.read_csv(StringIO(data),sep='\s+')
# create unique identifier for each row
df['id'] = df.reset_index().groupby('station')['index'].rank(method='first').astype(int)
# SQL-style self-join: all station 1's; all station 2's,etc.
t = pd.merge(left=df,right=df,how='inner',on='station',suffixes=('_l','_r'))
# don't compare station to itself
t = t[ t['id_l'] != t['id_r'] ]
# compute elapsed time (as timedelta object)
t['elapsed'] = pd.to_timedelta(t['dep_time_l']) - pd.to_timedelta(t['arr_time_r'])
# convert elapsed time to minutes (may not be necessary)
t['elapsed'] = t['elapsed'] / pd.Timedelta(minutes=1) # convert to minutes
# create display
t = (t[['station','elapsed','id_l','id_r']]
.sort_values(['station','id_r']))
print(t)
station elapsed id_l id_r
1 a 25.0 1 2
2 a -20.0 1 3
3 a -20.0 2 1
5 a -40.0 2 3
6 a 25.0 3 1
7 a 50.0 3 2
10 b -5.0 1 2
11 b 17.0 2 1
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。