我首先以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')]