python - 在 Pandas 中,如何按键中的每 N 行进行分组,保存一列的最后一个值并根据 'set' 中的所有行计算另一列?

标签 python pandas

我的数据结构如下,包含时间、类别、事件指标和数值。

输入

i  time       cat.  active  item_count
0  00:00:00   X     TRUE    2
1  00:00:06   X     FALSE   4
2  00:00:08   X     TRUE    13
3  00:00:25   Y     FALSE   11
4  00:01:10   Y     TRUE    2
5  00:01:58   Y     TRUE    6
6  00:02:53   Y     TRUE    2
7  07:40:29   X     FALSE   1
8  08:34:52   X     FALSE   2
9  11:50:48   X     TRUE    5
10 11:55:42   X     TRUE    3

我想计算类别中每 2 行的事件项目的比率,并复制每个 2 行集中最后一行的时间以获得以下输出:

输出

time     cat.  rate
00:00:06 X     0.33 (2/(2+4))
07:40:29 X     13/14
00:01:10 Y     2/13
00:02:53 Y     8/8
11:50:48 X     5/7
11:55:42 X     3/3

输入中的“集合”将是类别 X 的行 [[0,1], [2,7], [8,9], [10]] 和 [[3,4],[5 ,6]] 对于类别 Y。

我该如何设置?按类别排序,然后按时间排序,然后逐步遍历每 N 个项目?我在寻找解决方案时发现了 GroupBy.nth,但不确定它是否适用于此处。

最佳答案

首先使用cumcount创建助手系列 ,传递给另一个 groupby 并使用 last 聚合 lambda 函数,最后进行一些数据清理 - reset_index重命名:

此外,对于 rate 列,只需对 True 值求和,然后从右侧除以 rdiv所有值的总和

g = df.groupby('cat.').cumcount() // 2
df1 = (df.groupby(['cat.', g], sort=False)
        .agg({'item_count': 'sum', 'time':'last'}))

print (df1)
        item_count      time
cat.                        
X    0           6  00:00:06
     1          14  07:40:29
Y    0          13  00:01:10
     1           8  00:02:53
X    2           7  11:50:48
     3           3  11:55:42

s = df[df['active']].groupby(['cat.', g], sort=False)['item_count'].sum()
print (s)
cat.   
X     0     2
      1    13
Y     0     2
      1     8
X     2     5
      3     3
Name: item_count, dtype: int64
<小时/>
df1['rate'] = df1.pop('item_count').rdiv(s, axis=0)

d= {'time_last':'time'}
df1 = df1.reset_index(level=1, drop=True).reset_index().rename(columns=d)
print (df1)
  cat.      time      rate
0    X  00:00:06  0.333333
1    X  07:40:29  0.928571
2    Y  00:01:10  0.153846
3    Y  00:02:53  1.000000
4    X  11:50:48  0.714286
5    X  11:55:42  1.000000

关于python - 在 Pandas 中,如何按键中的每 N 行进行分组,保存一列的最后一个值并根据 'set' 中的所有行计算另一列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54851357/

相关文章:

python - 将列添加到 pandas 数据框中,从其他列中的列表中获取值

python - Pyinstaller 失败,因为在 Windows 上找不到 pyconfig.h

python - 通过分组分隔列中的数据

pandas - 将文本数据存储在pandas frame中,如何用sklearn实现简单的分类

python - 如何更改 Raspberry Pi 中的默认 Python 版本

python - 将 coverage.py 中的 .coverage 文件加载到 IntelliJ IDEA/PyCharm 的覆盖 View 中

python - Geoplot 不会绘制 geopandas 对象

python - .lower() 和正则表达式在同一行?

python - 如何从另一个数据框中找到数据框中点的最近邻点

python - 在 Python 中用累积数字进行元素划分?