python - python根据另一列中的时间分组和计数
问题描述
我正在尝试使用python进行分组并计算符合特定条件的记录数。
示例数据如下所示。我想创建一个新列“phone_cnt”来显示符合以下条件的呼叫数:首先,找到至少有一个 dept=0 记录的号码;然后计算在dept=0 调用之后发生的调用次数
np.random.seed(0)
# create an array of 17 dates starting at '2015-02-24', one per hour
rng = pd.date_range('2021-04-01', periods=17, freq='H')
df = pd.DataFrame({ 'time': rng, 'id': [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17],
'phone':[881,453,453,111,347,767,767,980,767,453,453,767,767,687,321,243,243],
'dept': [1,0,1,1,1,1,0,0,0,0,1,1,1,1,1,0,1]})
df
预期结果: 电话 243 的 phone_cnt=1;453 有 3 个计数,767 有 3 个计数,980 有 0 个计数
我已经尝试了以下步骤。前 2 步有效,但第 3 步是错误的。
# step 1: create a list of unique phone numbers which have dept=0 in records
phonelist = df[df['dept']==0].phone.unique()
# step 2: find all the calls from the above calls
df1 = df[df['phone'].isin(phonelist)].sort_values(by = ['phone','time'], ascending = [True, True])
df1
# step 3: count the number of calls in df1 that happened after the dept=0 call for each number
df2 =df1.groupby('phone')['time'].apply(lambda x: x>df[df['dept']==0].time).sum()).reset_index(name='count')
谁能帮我?谢谢!!
解决方案
这是您停止df1
使用的一种方式itertools.dropwhile
:
from itertools import dropwhile
is_nonzero = lambda x: x != 0
df1.groupby("phone").dept.apply(lambda gr: len(list(dropwhile(is_nonzero, gr))) - 1)
给
phone
243 1
453 3
767 3
980 0
Name: dept, dtype: int64
dropwhile
在其谓词(即本例中的非零性)成立时删除值。这样我们得到一个裁剪组,其中只0
存在第一个和剩余的元素。现在我们需要这些家伙的“长度减 1”。但是,由于dropwhile
返回一个“惰性”对象,我们list
先调用它,然后再调用len
它。(-1
最后是因为所需的值在第一个 0 之后。)
推荐阅读
- python - 在数据框中的列表中查找元素的索引
- r - Fisher 对基因计数数据的精确检验
- javascript - 将可存储的播放列表与 discord.js(机器人)集成
- javascript - 异步函数中的 HTTPS 请求 - 无数据
- xslt - 如何获取标签后的所有图像
, 至 。| xslt - c# - 在编译期间使用 MSBuild.exe 设置布尔变量
- python - 绘制 LSTM 会导致时间序列和逆标定器错误
- python - 使用 Python Selenium 抓取文本:无法找到真正存在的元素
- java - 线程“主”java.lang.NoClassDefFoundError 中的异常:org/bouncycastle/cms/Recipient
- typescript - 拖放列后保存数据