目录
1 导入、合并、预处理
使用 pandas 库处理excel表。
1.1 导入
read_excel 函数可以读取excel表并返回为 DataFrame 类型,这是pandas库的数据类型。
import pandas as pd
import matplotlib.pyplot as plt
dat1 = pd.read_excel("sta.xlsx", sheet_name="Acc1")
dat2 = pd.read_excel("sta.xlsx", sheet_name="Acc2")
也可以将字典转化为 DataFrame 类型。
import pandas as pd
data = {
'Category': ['A', 'B', 'A', 'B', 'A', 'B'],
'Value': [10, 20, 15, 25, 20, 30]
}
df = pd.DataFrame(data)
print(df)
1.2 合并
concat 函数可以合并两个工作表,其中 axis 参数默认为0,表示以行合并。如果设置axis为1,则以列合并。
dat = pd.concat([dat1, dat2], axis=0)
1.3 查看信息
head 函数可以查看前n行数据,info 函数可以查看表的信息。
dat.head(5)
dat.info()
1.4 数据清洗
空数据同样占用内存,所以需要清洗空数据。可以使用 dropna 函数。其中,axis参数用法同concat,inplace 函数为True时,会对原始数据修改,False时会复制一份数据。
dat.dropna(axis=1, inplace=True)
2 处理与统计
2.1 groupby 函数
2.1.1 用法
可以与 mean、sum、count、agg 函数等结合使用。目的如下。
声明分组
2.1.2 判断条件
当存在多个判断条件时,使用列表作为参数,列表元素为判断条件。
import pandas as pd
data = {
'Category': ['A', 'B', 'A', 'B', 'A', 'B'],
'Value': [10, 20, 15, 25, 20, 30]
}
df = pd.DataFrame(data)
print(df)
print("-----------------------")
gr = df.groupby(["Category", df["Value"] > 15])
print(gr["Value"].mean())
'''
Category Value
0 A 10
1 B 20
2 A 15
3 B 25
4 A 20
5 B 30
-----------------------
Category Value
A False 12.5
True 20.0
B True 25.0
Name: Value, dtype: float64
'''
2.1.3 apply 函数
可以用 apply 函数来代入自定义函数。
import pandas as pd
import numpy as np
data = {
'Category': ['A', 'B', 'A', 'B', 'A', 'B'],
'Value': [10, 20, 15, 25, 20, 30]
}
df = pd.DataFrame(data)
print(df.groupby("Category")["Value"].apply(lambda x: np.std(x)))
'''
Category
A 4.082483
B 4.082483
Name: Value, dtype: float64
'''
2.2 取平均
此处可以使用 round 函数,取一定精度。也可以使用pandas自带的 round 函数。
2.2.1 pandas 自带 mean 函数
较慢,不推荐使用。
ave = dat.['amounts'].mean()
print(round(ave, 2))
2.2.2 numpy.mean 函数
速度快,推荐使用。
ave = np.mean(dat['amounts'])
print(round(ave, 2))
2.2.3 结合 groupby
ave = dat.groupby("center").mean().round(2)
print(ave)
2.3 频数统计
2.3.1 频数计算
使用 value_counts 函数,返回pandas库中的 Series 类型。
cnt = dat['center'].value_counts()
print(cnt)
2.3.2 频数绘图
使用pandas自带的 plot 函数可以画条形图、线图。
cnt.plot(kind="bar", fontsize=16)
cnt.plot(kind="line", color=["r"])
plt.figure(figsize=(10, 6))
plt.show()
如果要在条形上注明数量,则需要遍历条形的位置,并用 plt.text 函数在图中打印。其中第一、二个参数描述位置,第三个参数为打印内容, ha 参数用于调整居中,fontsize 可调整字体大小。
cnt.plot(kind="bar", fontsize=12)
for x, y in enumerate(cnt):
plt.text(x, y + 2, y, ha="center", fontsize=5)
plt.show()
2.4 agg 函数
取平均mean、求和sum、计数count需要加双引号,也可以使用自定义函数,不需要双引号。
2.4.1 参数为列表
列表元素为函数。
import pandas as pd
import numpy as np
data = {
'Category': ['A', 'B', 'A', 'B', 'A', 'B'],
'Value': [10, 20, 15, 25, 20, 30]
}
df = pd.DataFrame(data)
print(df)
print("-------------------------------")
fn = lambda x: np.std(x)
ans = df.groupby("Category")["Value"]
print(ans.agg(["mean", "sum", fn]))
'''
Category Value
0 A 10
1 B 20
2 A 15
3 B 25
4 A 20
5 B 30
-------------------------------
mean sum <lambda_0>
Category
A 15.0 45 4.082483
B 25.0 75 4.082483
'''
2.4.2 参数为字典
字典索引为原始数据的特征值,内容为列表(其中为函数)或单个函数。
import pandas as pd
data = {
'Category': ['A', 'B', 'A', 'B', 'A', 'B'],
'Value1': [10, 20, 15, 25, 20, 30],
'Value2': [5, 10, 8, 12, 7, 15]
}
df = pd.DataFrame(data)
print(df)
print("--------------------------")
ans = df.groupby(['Category']).agg({
'Value1': ['mean', 'sum'],
'Value2': 'sum'
})
print(ans)
'''
Category Value1 Value2
0 A 10 5
1 B 20 10
2 A 15 8
3 B 25 12
4 A 20 7
5 B 30 15
--------------------------
Value1 Value2
mean sum sum
Category
A 15.0 45 20
B 25.0 75 37
'''
2.5 排序
使用 sort_values 函数。其中 by 参数确定排序的关键字,ascending 参数为True(默认)时为升序,否则降序。
import pandas as pd
data = {
'Category': ['A', 'B', 'A', 'B', 'A', 'B'],
'Value1': [10, 20, 15, 25, 20, 30],
'Value2': [5, 10, 8, 12, 7, 15]
}
df = pd.DataFrame(data)
dat_sort = df.sort_values(by='Value1', ascending=True)
print(dat_sort)
'''
Category Value1 Value2
0 A 10 5
2 A 15 8
1 B 20 10
4 A 20 7
3 B 25 12
5 B 30 15
'''