Python 在数据帧/时间序列中累积入口和出口
假设我有一个房间和一个数据框(/timeseries)Python 在数据帧/时间序列中累积入口和出口,python,pandas,Python,Pandas,假设我有一个房间和一个数据框(/timeseries)df,它在一列df['timestamp']中有每分钟的时间戳,在另外两列df['entries']和df['exits'](这些可能是0)。 现在我想创建第四列,它告诉我房间里有多少人df['count'] 当我尝试 df['count'] = 0 df['count'] = df.apply(lambda x: x['count'].shift(periods=1) + x['entries'] - x['exits'], axis=1)
df
,它在一列df['timestamp']
中有每分钟的时间戳,在另外两列df['entries']
和df['exits']
(这些可能是0)。现在我想创建第四列,它告诉我房间里有多少人
df['count']
当我尝试
df['count'] = 0
df['count'] = df.apply(lambda x: x['count'].shift(periods=1) + x['entries'] - x['exits'], axis=1)
我得到一个“AtributeError:'int'对象没有属性'shift'”谁能告诉我我做错了什么
原因是lambda函数被传递一行数据帧给函数。它是熊猫系列对象,
x['count']
只是一个数字。请注意,number没有shift属性
我不知道计算所需函数的快捷方式,所以我会编写一个手动循环
df['count'] = 0
for i, row in df.iterrows():
if i == 0:
# set up value for the first row
df.loc[0, 'count'] = row['entries'] - row['exits']
else:
# compute values for all other rows
df.iloc[i, 'count'] = prev + row['entries'] - row['exits']
prev = df.iloc[i, 'count'] # store previous value
这个怎么样
data = { 'count' : [0,0,0,0,0], 'into' : [1,4,3,2,4], 'out':[0,4,1,3,2]}
df = pd.DataFrame(data)
我们有数据
count into out
0 0 1 0
1 0 4 4
2 0 3 1
3 0 2 3
4 0 4 2
还有这个
df['countitem'] = df['into'] - df['out']
df['count'] = df['countitem'].cumsum()
给予
这里有一个方法
首先,你必须找出入口和出口的区别。然后你必须把这些值累加起来。这会给你想要的结果。请注意,如果第一行的出口多于入口,则第1行可能以负值结束
因为我没有你的数据,所以我生成了随机数。实际上,房间里不会有消极的人。所以,当你运行我的代码时,有可能你会在房间里遇到消极的人。这是因为随机整数的生成方式。如果这是针对实际值运行的,您将获得所需的结果
import pandas as pd
import random
from datetime import datetime
datelist = pd.date_range(start='2021-01-17', end=datetime.today(), freq='60min')
entries = random.sample(range(0,40),len(datelist))
exits = random.sample(range(0,20),len(datelist))
df = pd.DataFrame({'date':datelist,'entries':entries,'exits':exits})
df['diff'] = df['entries'] - df['exits']
df['diff'] = df['diff'].cumsum()
print (df)
date entries exits
0 2021-01-17 00:00:00 12 12
1 2021-01-17 01:00:00 31 14
2 2021-01-17 02:00:00 33 15
3 2021-01-17 03:00:00 29 11
4 2021-01-17 04:00:00 8 13
5 2021-01-17 05:00:00 5 2
6 2021-01-17 06:00:00 16 1
7 2021-01-17 07:00:00 3 5
8 2021-01-17 08:00:00 38 18
9 2021-01-17 09:00:00 37 0
10 2021-01-17 10:00:00 13 9
11 2021-01-17 11:00:00 27 17
12 2021-01-17 12:00:00 2 10
13 2021-01-17 13:00:00 14 7
14 2021-01-17 14:00:00 35 3
15 2021-01-17 15:00:00 26 8
16 2021-01-17 16:00:00 28 4
date entries exits diff
0 2021-01-17 00:00:00 12 12 0
1 2021-01-17 01:00:00 31 14 17
2 2021-01-17 02:00:00 33 15 35
3 2021-01-17 03:00:00 29 11 53
4 2021-01-17 04:00:00 8 13 48
5 2021-01-17 05:00:00 5 2 51
6 2021-01-17 06:00:00 16 1 66
7 2021-01-17 07:00:00 3 5 64
8 2021-01-17 08:00:00 38 18 84
9 2021-01-17 09:00:00 37 0 121
10 2021-01-17 10:00:00 13 9 125
11 2021-01-17 11:00:00 27 17 135
12 2021-01-17 12:00:00 2 10 127
13 2021-01-17 13:00:00 14 7 134
14 2021-01-17 14:00:00 35 3 166
15 2021-01-17 15:00:00 26 8 184
16 2021-01-17 16:00:00 28 4 208
你能分享一个样本数据集吗。它是记录每一个人的进出,还是每分钟记录一次每分钟进出人数的摘要。它是每分钟记录一次摘要。我实际上想分享df,但我不知道我的回答如何帮助您获得解决方案。你所需要做的就是得到差异,然后做一个总和来跟踪里面的人
import pandas as pd
import random
from datetime import datetime
datelist = pd.date_range(start='2021-01-17', end=datetime.today(), freq='60min')
entries = random.sample(range(0,40),len(datelist))
exits = random.sample(range(0,20),len(datelist))
df = pd.DataFrame({'date':datelist,'entries':entries,'exits':exits})
df['diff'] = df['entries'] - df['exits']
df['diff'] = df['diff'].cumsum()
print (df)
date entries exits
0 2021-01-17 00:00:00 12 12
1 2021-01-17 01:00:00 31 14
2 2021-01-17 02:00:00 33 15
3 2021-01-17 03:00:00 29 11
4 2021-01-17 04:00:00 8 13
5 2021-01-17 05:00:00 5 2
6 2021-01-17 06:00:00 16 1
7 2021-01-17 07:00:00 3 5
8 2021-01-17 08:00:00 38 18
9 2021-01-17 09:00:00 37 0
10 2021-01-17 10:00:00 13 9
11 2021-01-17 11:00:00 27 17
12 2021-01-17 12:00:00 2 10
13 2021-01-17 13:00:00 14 7
14 2021-01-17 14:00:00 35 3
15 2021-01-17 15:00:00 26 8
16 2021-01-17 16:00:00 28 4
date entries exits diff
0 2021-01-17 00:00:00 12 12 0
1 2021-01-17 01:00:00 31 14 17
2 2021-01-17 02:00:00 33 15 35
3 2021-01-17 03:00:00 29 11 53
4 2021-01-17 04:00:00 8 13 48
5 2021-01-17 05:00:00 5 2 51
6 2021-01-17 06:00:00 16 1 66
7 2021-01-17 07:00:00 3 5 64
8 2021-01-17 08:00:00 38 18 84
9 2021-01-17 09:00:00 37 0 121
10 2021-01-17 10:00:00 13 9 125
11 2021-01-17 11:00:00 27 17 135
12 2021-01-17 12:00:00 2 10 127
13 2021-01-17 13:00:00 14 7 134
14 2021-01-17 14:00:00 35 3 166
15 2021-01-17 15:00:00 26 8 184
16 2021-01-17 16:00:00 28 4 208