繁体   English   中英

从 Python DataFrame 计算按用户变量分组的多个测试项目

[英]Count multiple tested items grouped by user variables from Python DataFrame

我已将用户测试数据文件整理到 DataFrame 中,其中第 0 - 2 列是他们的特征,从第 3 列开始的列有他们测试过的产品品牌类型/型号的项目代码。 我想统计按级别、年龄组和性别分组的唯一项目代码,以创建摘要并跟踪某些模型的测试次数。 output 需要列出项目代码名称以及针对该特定用户特征测试了多少次,即针对精英,20-40,F:T3 已经测试了 12 次。

我曾尝试使用 groupby() 方法,但也无法获取列出的实际项目代码名称及其出现次数。

output 可以是表格形式,DataFrame,或者建议另一种有效的方法来解决这个问题。

Dataframe 格式:

                  age-
index level       group  gender  0     1     2    ...... 80
1     elite        20-40   F    T3    T4    RR23        T34
2     intermediate <11     M    T56   T44   RR2         T81
3     elite        11-20   M    T45   RR23  T3          RR2
4     beginner     >40     F    RR2   T56   T3          T45
5     advanced     20-40   F    RR22  T4    T45         RR22
6     beginner     11-20   M    T81   T4    T56         T4

首先,请参阅这篇关于如何制作好的 pandas 示例的帖子。

df

          level  group gender     0     1     2     3
0         elite  20-40      F    T3    T4  RR23   T34
1  intermediate    <11      M   T56   T44   RR2   T81
2         elite  11-20      M   T45  RR23    T3   RR2
3      beginner    >40      F   RR2   T56    T3   T45
4      advanced  20-40      F  RR22    T4   T45  RR22
5      beginner  11-20      M   T81    T4   T56    T4
6  intermediate    <11      M   T56   T44   RR2   T34
7         elite  11-20      M   T45  RR23    T3  RR23

假设每一行对应一个人,并且 80 列(用数字标记)是对该人进行的 80 次试验/实验的某种结果,则可以重新组织数据,以便可以轻松地对其进行汇总和计数。

import numpy as np
import pandas as pd
from collections import Counter

values = pd.unique(df.loc[:, df.columns[3:]].values.ravel('K'))
cols = df.columns[:3].to_list() + list(values)
df2 = pd.DataFrame(data=[], columns=cols)

counts = df.loc[:, df.columns[3:]].apply(Counter, axis=1)
for i, c in enumerate(counts):
    tmp = pd.DataFrame(dict(c), index=[i])
    df2 = df2.append(tmp, ignore_index=True)
df2.loc[:, df2.columns[:3]] = df.loc[:, df.columns[:3]]
df2 = df2.fillna(0)

这使得列名称为实际结果 label,并且该值对应于该结果 label 的“计数”。

          level  group gender  T3  T56  T45  RR2  RR22  T81  T4  T44  RR23  T34
0         elite  20-40      F   1    0    0    0     0    0   1    0     1    1
1  intermediate    <11      M   0    1    0    1     0    1   0    1     0    0
2         elite  11-20      M   1    0    1    1     0    0   0    0     1    0
3      beginner    >40      F   1    1    1    1     0    0   0    0     0    0
4      advanced  20-40      F   0    0    1    0     2    0   1    0     0    0
5      beginner  11-20      M   0    1    0    0     0    1   2    0     0    0
6  intermediate    <11      M   0    1    0    1     0    0   0    1     0    1
7         elite  11-20      M   1    0    1    0     0    0   0    0     2    0

现在,如果您想计算一些组统计数据,例如在级别、组和性别分组中存在多少“T3”结果,您可以按级别、组和性别进行分组。

df2.groupby(['level', 'group', 'gender'])['T3'].sum()

level         group  gender
advanced      20-40  F         0
beginner      11-20  M         0
              >40    F         1
elite         11-20  M         2
              20-40  F         1
intermediate  <11    M         0
Name: T3, dtype: int64

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM