Python 在数据帧/时间序列中累积入口和出口

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)

假设我有一个房间和一个数据框(/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)
我得到一个“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