【Python】Pandas 库

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 用法

可以与 meansumcountagg 函数等结合使用。目的如下。

声明分组

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
'''
  • 20
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值