python - 熊猫根据条件重新采样和聚合
问题描述
我有一个 DataFrame,其中有一列状态如下:
datetime | session | try | status
2020-09-17 10:00:01 | '1a' | '1a_1' | 'success'
2020-09-17 10:00:02 | '2a' | '2a_1' | 'fail'
2020-09-17 10:00:03 | '2a' | '2a_2' | 'success'
2020-09-17 10:00:03 | '3a' | '3a_1' | 'interrupted'
2020-09-18 13:00:04 | '4a' | '4a_1' | 'fail'
我想按天对数据进行重新采样,并在会话中按条件计数状态类型(而不是尝试)。
我可以像这样轻松地尝试重新采样:
df['date'] = df['datetime'].dt.date
df['ones'] = np.ones(df.shape[0])
piv = df.pivot_table(index='date', columns='status', values='ones', aggfunc=len).fillna(0)
并且有:
day | success | fail | interrupted
2020-09-17 | 2 | 2 | 1
2020-09-18 | 0 | 1 | 0
但是无论会话中尝试了多少次,我都想按会话聚合它:
- 如果会话中的“成功”状态尝试,则成功+1,失败+0,中断+0;
- 如果会话中的“中断”状态并且会话中没有“成功”状态,则成功+0,失败+0,中断+1;
- 如果会话中没有“中断”和“成功”状态,则成功+0,失败+1,中断+0。
所以我应该得到这样的东西:
day | success | fail | interrupted
2020-09-17 | 2 | 0 | 1
2020-09-18 | 0 | 1 | 0
我坚持使用功能,我想出的所有结果都以“ValueError:系列的真值是模棱两可的”结尾。对于任何想法,我都会非常满意。
解决方案
我的想法是将 statust 的值转换为有序类别,仅使用在传递给参数的列表中定义的最重要值进行排序和获取行categories
:
print (df)
datetime session try status
0 2020-09-17 10:00:01 1a 1a_1 success
1 2020-09-17 10:00:02 2a 2a_1 fail
2 2020-09-17 10:00:03 2a 2a_2 success
3 2020-09-17 10:00:03 3a 3a_1 interrupted
4 2020-09-18 13:00:04 4a 4a_1 fail
5 2020-09-19 10:00:01 1a 1a_1 interrupted
6 2020-09-19 10:00:02 1a 2a_1 fail
7 2020-09-19 10:00:03 2a 2a_2 success
8 2020-09-19 10:00:03 2a 3a_1 interrupted
df['status'] = pd.Categorical(df['status'],
ordered=True,
categories=['success','interrupted','fail'])
df['date'] = df['datetime'].dt.date
df1 = df.sort_values(['date','status']).drop_duplicates(['date','session'])
print (df1)
datetime session try status date
0 2020-09-17 10:00:01 1a 1a_1 success 2020-09-17
2 2020-09-17 10:00:03 2a 2a_2 success 2020-09-17
3 2020-09-17 10:00:03 3a 3a_1 interrupted 2020-09-17
4 2020-09-18 13:00:04 4a 4a_1 fail 2020-09-18
7 2020-09-19 10:00:03 2a 2a_2 success 2020-09-19
5 2020-09-19 10:00:01 1a 1a_1 interrupted 2020-09-19
piv = pd.crosstab(df1['date'], df1['status'])
print (piv)
status success interrupted fail
date
2020-09-17 2 1 0
2020-09-18 0 0 1
2020-09-19 1 1 0
推荐阅读
- python - 带有选择位置的 pyspark 新列
- php - PHP函数,将随机唯一数字添加到匹配某个值的数组中
- ios - 问题:崩溃:com.apple.main-thread。我找不到问题出在哪里
- model - 如何在闭环系统中找到真正的影响因素?
- select - 服务中的 NGXS @Select 导致问题
- javascript - React 没有呈现正确的条件元素
- javascript - JavaScript instantiates class without usage React Native
- laravel - onClick按钮后需要在地址栏中隐藏显示数组数据
- c++ - 基于 C++ CMake 的项目:如何一次批量构建所有配置和类型?
- python - Tkinter:单击按钮后如何返回参数?