python - Pandas groupby 和基于多列的转换

标签 python pandas dataframe group-by transform

我见过很多类似的问题,但似乎没有一个适合我的情况。我很确定这只是一个 groupby 转换,但我不断收到 KeyError 以及 axis 问题。我正在尝试对 filename 进行分组并检查 pred != gt 的计数。

例如,索引 2 是 f1.wav 的唯一索引,因此是 1,索引 (13,14,18) 是 f2.wav 的唯一索引,因此是 3。

df = pd.DataFrame([{'pred': 0, 'gt': 0, 'filename': 'f1.wav'}, {'pred': 0, 'gt': 0, 'filename': 'f1.wav'}, {'pred': 2, 'gt': 0, 'filename': 'f1.wav'}, {'pred': 0, 'gt': 0, 'filename': 'f1.wav'}, {'pred': 0, 'gt': 0, 'filename': 'f1.wav'}, {'pred': 0, 'gt': 0, 'filename': 'f1.wav'}, {'pred': 0, 'gt': 0, 'filename': 'f1.wav'}, {'pred': 0, 'gt': 0, 'filename': 'f1.wav'}, {'pred': 0, 'gt': 0, 'filename': 'f1.wav'}, {'pred': 0, 'gt': 0, 'filename': 'f1.wav'}, {'pred': 0, 'gt': 0, 'filename': 'f2.wav'}, {'pred': 0, 'gt': 0, 'filename': 'f2.wav'}, {'pred': 2, 'gt': 2, 'filename': 'f2.wav'}, {'pred': 0, 'gt': 2, 'filename': 'f2.wav'}, {'pred': 0, 'gt': 2, 'filename': 'f2.wav'}, {'pred': 0, 'gt': 0, 'filename': 'f2.wav'}, {'pred': 0, 'gt': 0, 'filename': 'f2.wav'}, {'pred': 2, 'gt': 2, 'filename': 'f2.wav'}, {'pred': 0, 'gt': 2, 'filename': 'f2.wav'}, {'pred': 2, 'gt': 0, 'filename': 'f2.wav'}])
    pred  gt filename
0      0   0   f1.wav
1      0   0   f1.wav
2      2   0   f1.wav
3      0   0   f1.wav
4      0   0   f1.wav
5      0   0   f1.wav
6      0   0   f1.wav
7      0   0   f1.wav
8      0   0   f1.wav
9      0   0   f1.wav
10     0   0   f2.wav

预期输出

    pred  gt filename  counts
0      0   0   f1.wav       1
1      0   0   f1.wav       1
2      2   0   f1.wav       1
3      0   0   f1.wav       1
4      0   0   f1.wav       1
5      0   0   f1.wav       1
6      0   0   f1.wav       1
7      0   0   f1.wav       1
8      0   0   f1.wav       1
9      0   0   f1.wav       1
10     0   0   f2.wav       3
11     0   0   f2.wav       3
12     2   2   f2.wav       3
13     0   2   f2.wav       3
14     0   2   f2.wav       3
15     0   0   f2.wav       3
16     0   0   f2.wav       3
17     2   2   f2.wav       3
18     0   2   f2.wav       3
19     2   0   f2.wav       3

我在想 df.groupby('filename').transform(lambda x: x['pred'].ne(x['gt']).sum(), axis=1) 但我得到 TypeError: Transform function invalid for data types

最佳答案

.transform 分别对每一列进行操作,因此您无法在转换操作中同时访问“pred”和“gt”。

这给您留下了 2 个选择:

  1. 聚合并重新索引或连接回原始形状
  2. 预先计算 bool 数组并对其进行.transform

方法 2 在这里可能是最快的:

df['counts'] = (
    (df['pred'] != df['gt'])
    .groupby(df['filename']).transform('sum')
)

print(df)
    pred  gt filename  counts
0      0   0   f1.wav       1
1      0   0   f1.wav       1
2      2   0   f1.wav       1
3      0   0   f1.wav       1
4      0   0   f1.wav       1
5      0   0   f1.wav       1
6      0   0   f1.wav       1
7      0   0   f1.wav       1
8      0   0   f1.wav       1
9      0   0   f1.wav       1
10     0   0   f2.wav       4
11     0   0   f2.wav       4
12     2   2   f2.wav       4
13     0   2   f2.wav       4
14     0   2   f2.wav       4
15     0   0   f2.wav       4
16     0   0   f2.wav       4
17     2   2   f2.wav       4
18     0   2   f2.wav       4
19     2   0   f2.wav       4

请注意,f2.wav 有 4 个实例,其中 'pre' != 'gt'(索引 13、14、18、19)

关于python - Pandas groupby 和基于多列的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73708230/

相关文章:

python - 如何将 SQL 查询结果转换为 PANDAS 数据结构?

r - 基于R中的多个因素确定多个变量的频率

r - 如何根据条件使用 igraph 更改 R 中的 vertex.shape

python - 如何使用周期性值列拆分 pandas 数据框

python - 如何向一个键添加多个列表?

python ,Linux : streaming to and from cmdline

python - 使用python LXML从html网页中提取信息

python - 排序索引满足一定条件的数据框

python - 交叉连接/合并 dataframe1 以根据 dataframe1 中的列创建组合的 dataframe2

python - 使用python读取txt文件并回答问题