计算Excel表格类型的数据集的各种统计值

该博客介绍了如何利用pandas库对Dry_Bean数据集进行统计分析,包括计算不同品种(如SEKER、BARBUNYA等)的属性平均值,并将结果保存到Excel文件。通过定义函数analyse_save,实现了按类别计算平均值、最大值、最小值、中位数和计数,并能灵活选择统计方法。最终,博主展示了更简洁的代码实现,用以替代原先较臃肿的实现方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我首先以dry bean数据集作为本次的尝试Excel
在这里插入图片描述
可以看到,该数据集有16个属性和一个标签,而标签总共有分为7种,分别为: SEKER,BARBUNYA,
BOMBAY,CALI, HOROZ,SIRA,DERMASON0,我想计算一下这七个品种的每个属性的平均值,我使用pandas实现并且把它们保存到Excel表格:
平均值使用pandas自带计算平均值的函数xx.mean()

最新改了一下,封装成函数,可以计算数据集的平均值,中位数,最大值,最小值,计数:

import pandas as pd


def analyse_save(name1, lie, Method):
    """
    将数据集的统计值保存到对于Excel
    :param name1: 数据集名字
    :param lie: 选取那列作为分类标准
    :param Method: 计算数据集的方法
    :return:
    """
    key = name1.find('csv')
    if key != -1:
        df = pd.read_csv(name1)
    else:
        df = pd.read_excel(name1, engine='openpyxl')

    # 分组以哪一列为标准
    grouped = df.groupby(lie)
    # 计算平均值并且保存
    means = grouped.agg(Method)
    means.insert(0, "种类", means.index)
    x = name1.split('.')[0]
    if (Method == 'mean'):
        means.to_excel(f'{x}的平均值.xlsx', index=None)
        print(f'Save to {x}的平均值.xlsx')
    elif (Method == 'max'):
        means.to_excel(f'{x}的最大值.xlsx', index=None)
        print(f'Save to {x}的最大值.xlsx')
    elif (Method == 'min'):
        means.to_excel(f'{x}的最小值.xlsx', index=None)
        print(f'Save to {x}的最小值.xlsx')
    elif (Method == 'median'):
        means.to_excel(f'{x}的中位数.xlsx', index=None)
        print(f'Save to {x}的中位数.xlsx')
    elif (Method == 'count'):
        mean = pd.DataFrame()
        mean["种类"] = means["种类"]
        mean['计数']=means.iloc[:,1]
        mean.to_excel(f'{x}的计数.xlsx', index=None)
        print(f'Save to {x}的计数.xlsx')


if __name__ == "__main__":
    filename = 'Dry_Bean.xlsx'
    # mean:平均值  max:最大值  min:最小值  median:中位数  count:计数
    # 函数第一个参数为数据集名字,第二个参数为哪列作划分,第三个参数为方法
    analyse_save(filename, 'Class', 'mean')

下面是对pandas掌握不熟练写的比较臃肿的代码,可以不看。
第一次使用的是lambda完成的

import pandas as pd

readbook = pd.read_excel('Dry_Bean.xlsx', engine='openpyxl')

SEKER = readbook.loc[readbook['Class'].apply(lambda a: a == 'SEKER')]
BARBUNYA = readbook.loc[readbook['Class'].apply(lambda a: a == 'BARBUNYA')]
BOMBAY = readbook.loc[readbook['Class'].apply(lambda a: a == 'BOMBAY')]
CALI = readbook.loc[readbook['Class'].apply(lambda a: a == 'CALI')]
HOROZ = readbook.loc[readbook['Class'].apply(lambda a: a == 'HOROZ')]
SIRA = readbook.loc[readbook['Class'].apply(lambda a: a == 'SIRA')]
DERMASON = readbook.loc[readbook['Class'].apply(lambda a: a == 'DERMASON')]

SEKER0 = SEKER.mean().to_numpy()
BARBUNYA0 = BARBUNYA.mean().to_numpy()
BOMBAY0 = BOMBAY.mean().to_numpy()
CALI0 = CALI.mean().to_numpy()
HOROZ0 = HOROZ.mean().to_numpy()
SIRA0 = SIRA.mean().to_numpy()
DERMASON0 = readbook.mean().to_numpy()

means = pd.DataFrame({
    '特征': ['Area', 'Perimeter', 'MajorAxisLength', 'MinorAxisLength', 'AspectRation', 'Eccentricity', 'ConvexArea',
           'EquivDiameter',
           'Extent', 'Solidity', 'roundness', 'Compactness', 'ShapeFactor1', 'ShapeFactor2', 'ShapeFactor3',
           'ShapeFactor4'],
    'SEKER0': SEKER0,
    'BARBUNYA0': BARBUNYA0,
    "BOMBAY0": BOMBAY0,
    'CALI0': CALI0,
    'HOROZ0': HOROZ0,
    'SIRA0': SIRA0,
    'DERMASON0': DERMASON0,
})

means.to_excel('dry Bean的平均值.xlsx', index=None)
print('ok')

看一下保存的dry Bean的平均值.xlsx
在这里插入图片描述
后来发现可以使用官方提供的一种方法:

SEKER = readbook[readbook['Class'] == 'SEKER']

可以代替:

SEKER = readbook.loc[readbook['Class'].apply(lambda a: a == 'SEKER')]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

<编程路上>

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值