6-pandas分组聚合与数据读取

发布于:2025-02-11 ⋅ 阅读:(9) ⋅ 点赞:(0)

目录

前言

一、分组聚合

1.groupby使用:

2. agg方法:

二、透视表pivot_table()

1.引入库

2.提取日期dt.strftime()

三、文件读取

1.read_csv

(1)表头设置header

(2)设置索引列index_col

(3)使用哪些列use_cols

(4)日期转换parse_dates

2.读取文本内容read_table

3.大文件读取

4.Excel文件读取read_excel 

5.html数据读取read_html 

四、文件保存

保存为csv格式 to_csv

五、拓展

1.内容提取str.extract()

2.str属性 


前言

Pandas 提供了一个 groupby 方法,可以根据某一列或多列对数据进行分组操作,并对分组后的数据进行聚合操作,如计算平均值、求和等。

pandas提供了处理时间序列数据的工具,如日期范围生成和频率转换。


一、分组聚合

1.groupby使用:

groupby() 是 pandas 库中用于对数据进行分组操作的一个非常重要的方法。

import pandas as pd

data = {'城市': ['北京', '上海', '广州', '北京', '上海', '广州'],
        '人口': [2154, 2424, 1303, 2154, 2424, 1303],
        '年龄': [25, 30, 35, 25, 30, 35],
        '收入': [5000, 6000, 7000, 5000, 6000, 7000]}

df2 = pd.DataFrame(data)

# 计算每个城市的平均年龄 
df2.groupby('城市')['年龄'].mean()

# 每个城市的平均收入
df2.groupby('城市')['收入'].mean()

# 计算每个城市的总人口
df2.groupby('城市')['人口'].sum()

2. agg方法:

(1)单个函数聚合----如果你只想对某一列应用一个函数,可以直接传递该函数的名字或函数对象给 agg 方法:

eg:agg({'金额': 'sum'})

(2)多个函数聚合----如果你想对某一列应用多个函数,可以传递一个列表给 agg 方法。

eg:agg({'金额': ['sum', 'mean']})

(3)不同的列不同函数----如果你希望对不同的列应用不同的聚合函数,可以在 agg 方法中传入一个字典,字典的键是列名,值是函数或函数列表。

eg:agg({'金额': 'sum', '订单号': 'count'})

data = {
    'UserId': [101, 102, 103, 104, 105],
    'Date': ['2023-10-01', '2023-10-01', '2023-10-02', '2023-10-03', '2023-10-03'],
    'Product': ['笔记本', '鼠标', '键盘', '笔记本', '显示器'],
    'Quantity': [2, 5, 3, 1, 2],
    'Amount': [2000, 50, 150, 1000, 400]
}
df3 = pd.DataFrame(data)

# 每个产品的销售总额和销售量
df3.groupby('Product').agg({'Amount':'sum','Quantity':'sum'})


# 每个用户下单的最早日期和最晚日期
df3.groupby('UserId')['Date'].agg(['min','max'])

二、透视表pivot_table()

透视表用来进行数据汇总和分析

1.引入库

代码如下(示例):

data = {
    '订单日期': pd.date_range(start='2023-01-01', periods=12, freq='M'),
    '产品类别': ['电子产品', '家居用品', '服装', '电子产品', '家居用品', '服装', '电子产品', '家居用品', '服装', '电子产品', '家居用品', '服装'],
    '销售额': [5000, 3000, 2000, 5500, 3200, 2200, 6000, 3500, 2300, 5200, 3100, 2100]
}
df4 = pd.DataFrame(data)


# 统计每个月不同产品的销售额
import numpy as np

pd.pivot_table(df4,values='销售额',columns='产品类别',index=df4['订单日期'].dt.strftime('%Y %m'),aggfunc=np.sum,fill_value=0)

2.提取日期dt.strftime()

获取年月

代码如下(示例):

df4['订单日期'].dt.strftime('%Y %m')

3.

三、文件读取

1.read_csv

pd.read_csv(r'C:\Users\B\Desktop\数据源\exa5.csv',encoding='ANSI')

pd.read_csv(r'C:\Users\B\Desktop\数据源\exa5.csv',encoding='gbk')  # encoding='gbk'设置编码方式

path = r'C:\Users\B\Desktop\数据源\exa5.csv'
pd.read_csv(path,sep='\t',encoding='gbk')

(1)表头设置header

pd.read_csv(path,header=0,encoding='gbk')

(2)设置索引列index_col

pd.read_csv(path,index_col=0,encoding='gbk')  # 设置列名下标为0的列,作为索引列

pd.read_csv(path,index_col='股票2',encoding='gbk')

(3)使用哪些列use_cols

pd.read_csv(path,usecols=[0,4,5],encoding='gbk')

(4)日期转换parse_dates

df6 = pd.read_csv(path,parse_dates=['日期'],encoding='gbk')

2.读取文本内容read_table

df8 = pd.read_table(r'C:\Users\B\Desktop\数据源\exa2.txt',sep='\s+') # sep='\s+' 凡是有空格的地方就分割


3.大文件读取

chunksize=1000设置块的大小

df9 = pd.read_csv(r'C:\Users\B\Desktop\数据源\exa5.csv',chunksize=1000,encoding='gbk') # chunksize=1000设置块的大小
data = pd.DataFrame([])
for chunk in df9:
    chunk = pd.DataFrame(chunk)
    data = pd.concat([data,chunk])

4.Excel文件读取read_excel 

# excel工作薄里有多张表时,要使用sheet_name读取指定表
df10 = pd.read_excel(r'C:\Users\B\Desktop\数据源\exa10.xlsx',sheet_name='股票')

df11 = pd.read_excel(r'C:\Users\B\Desktop\数据源\exa10.xlsx',sheet_name='评论')

5.html数据读取read_html 

df11 = pd.read_html('https://www.air-level.com/rank')[0]
df12 = pd.read_html('https://vip.stock.finance.sina.com.cn/q/go.php/vComStockHold/kind/jgcg/index.phtml')[0]
 

lst = []
for i in range(1,3):
    url = f'https://vip.stock.finance.sina.com.cn/q/go.php/vComStockHold/kind/jgcg/index.phtml?p={i}'
    df = pd.read_html(url)[0]
    lst.append(df)
data = pd.concat(lst,ignore_index=True)

四、文件保存

保存为csv格式 to_csv

df7.to_csv('test.csv')

df7.to_excel('test2.xls')

df7.to_excel('test2.xlsx',index=False)

data.to_html('hehe.html')

五、拓展

1.内容提取str.extract()

通过正则提取字母

data = {'info': ['John 25', 'Lucy 30', 'Bob 28']}
df7 = pd.DataFrame(data)


df7['name'] = df7['info'].str.extract(r'(\w+)')

2.str属性 

data = {'姓名': ['lily Smith', 'lucy Johnson', 'jack Brown', 'tom Lee'],
        '入职日期': ['2022-05-15', '2020-10-01', '2019-07-20', '2023-03-10']}
df = pd.DataFrame(data)

# 提取【姓名】里的名
df['姓名'].str.split(' ')[0]


#结果['lily', 'Smith']

df['姓名'].str.split(' ').str[0]  # 批量定位到单元格内部,通过下标取值


'''
结果
0    lily
1    lucy
2    jack
3     tom
Name: 姓名, dtype: object
'''


# 提取入职年份
df['入职日期'].str[:4]


总结

Pandas 提供了多种方法用于读取不同格式的数据,如 CSV、Excel、JSON 等。