首页 > 解决方案 > Python excel根据其他列的组合计算一列的值数

问题描述

我有这个 excel 表,它具有以下示例数据(底部编辑部分中的文本格式数据):

在此处输入图像描述

我想做的是:

  1. 对于每个(语言、供应商、文件名),计算得分值的总数(不是得分的总和,而是得分的总数)。所以类似于这个(底部编辑部分中的文本格式数据):

在此处输入图像描述

  1. 对于每个 (language,vendor,filename),计算 score 值高于 0.6 的总计数(不是总分,而是总分)

在我的 python 代码中,我可以使用以下方法将 excel 文件读入 pandas 数据框:

import pandas as pd
from pandas import ExcelWriter
from pandas import ExcelFile


def read_scores_excel():

    df = pd.read_excel('scores.xlsx', sheet_name='scores')

    print("Column headings:")
    print(df.columns)

    languages = df['language']
    vendor_name = df['vendor']
    file_anme = df['filename']
    score = df['score']


if __name__ == '__main__':
    read_scores_excel()

但我无法进一步实现逻辑。如何实现逻辑以便获得计数值?

编辑:

文本中的示例输入数据:

vendor  filename    language    score
Vendor 1    File 1  chinese 0.67717278
Vendor 1    File 1  chinese 0.644506991
Vendor 1    File 1  chinese 0.999999523
Vendor 1    File 1  chinese 0.756420255
Vendor 1    File 1  chinese 0.737005472
Vendor 2    File 2  Japanese    0.637181938
Vendor 2    File 2  Japanese    0.756420255
Vendor 2    File 2  Japanese    0.737005472
Vendor 2    File 2  Japanese    0.637181938
Vendor 2    File 1  chinese 0.637181938
Vendor 3    File 1  chinese 0.637181938
Vendor 3    File 1  chinese 0.737005472
Vendor 3    File 3  English 0.637181938
Vendor 3    File 3  English 0.756420255
Vendor 3    File 3  English 0.737005472
Vendor 3    File 3  English 0.637181938

文本中的示例输出数据:

Chinese Vendor 1    File 1  190
Chinese Vendor 1    File 2  187
Chinese Vendor 2    File 1  245
Chinese Vendor 2    File 2  225
Japnese Vendor 1    File 1  245
Japnese Vendor 1    File 3  212
English Vendor 1    File 1  245
English Vendor 3    File 3  245

标签: pythonexcelpandasdataframe

解决方案


以下应该可以解决问题:

df.groupby(['language', 'vendor','filename']) \
  .agg(score_count=('score', 'count'))

例如,

import pandas as pd


test_df = pd.DataFrame(
    data=[
        ('Vendor 1', 'File 1', 'chinese', 0.67717278),
        ('Vendor 1', 'File 1', 'chinese', 0.737005472),
        ('Vendor 2', 'File 2', 'Japanese',0.637181938),
    ], 
    columns=['vendor', 'filename', 'language', 'score']
)


print(test_df.groupby(['language', 'vendor','filename']).agg(score_count=('score', 'count')))

输出将是:

                            score_count
language vendor   filename             
Japanese Vendor 2 File 2              1
chinese  Vendor 1 File 1              2

推荐阅读