pandas介绍
基于numpy构建的
主要功能:
- 具备对其功能的数据结构DataFrame,Series
- 集成时间序列功能
- 提供丰富的数学运算和操作
- 灵活处理缺失数据
安装
pip install pandas
Series array+dict
import pandas as pd
a = pd.Series([56, 78, 35, 23]) # 左边是索引
# print(a)
b = pd.Series([56, 78, 35, 23], index=['a', 'b', 'c', 'd']) # 左边是自定义的值
# print(b)
# 有两种索引方式
print(b[0], b['a'])
# 花式索引
print(b[['a', 'c']])
# 两个series的运算, 必须是同种类型
print(a + pd.Series([12, 455, 12, 1]))
# 和 array的运算类似
print(b * 2)
# 切片
# print(b[0:2])
# 通用函数
print(a.sum())
# 布尔过滤
print(a[a > 60])
# 通过字典创建series
a = pd.Series({'a': 1, 'b': 45, 'c': 5})
print(a)
# in
print('a' in a)
for i in a:
# 遍历的是series的值
print(i)
# 获取索引
print(a.index)
# Index(['a', 'b', 'c'], dtype='object'), 就是一个array对象
# 获取值
print(a.values)
整数问题
import pandas as pd
import numpy as np
a = pd.Series(np.arange(1, 21))
b = a[10:].copy()
print(b)
# 整数索引的问题
print(b[10]) # 11
# 因为索引解析有两种
# 强制按标签解析
print(b.loc[10]) # 11
# 强制按索引解析
print(b.iloc[9]) # 20
数据对齐
import pandas as pd
sr1 = pd.Series([21, 2, 4], index=['a', 'b', 'c'])
sr2 = pd.Series([12, 10, 3], index=['a', 'c', 'd'])
print(sr1 + sr2)
# 通过标签对齐, 这样就会出现问题
"""
a 33.0
b NaN
c 14.0
d NaN
"""
# pandas内置了加减乘除四个函数 add sub div mul
print(sr1.add(sr2))
print(sr1.add(sr2, fill_value=0)) # 如果对应的位置没有数,那么就默认是0
"""
a 33.0
b 2.0
c 14.0
d 3.0
"""
数据缺失问题
import pandas as pd
sr1 = pd.Series([21, 2, 4], index=['a', 'b', 'c'])
sr2 = pd.Series([12, 10, 3], index=['a', 'c', 'd'])
c = sr1 + sr2
# print(c)
"""
a 33.0
b NaN
c 14.0
d NaN
"""
# 1. 删掉缺失数据
# 判断某一行是否缺失数据
print(c.isnull())
"""
a False
b True
c False
d True
"""
print(c.notnull())
"""
a True
b False
c True
d False
"""
# 布尔过滤
print(c[c.notnull()])
"""
a 33.0
c 14.0
"""
# 扔掉nan数据
print(c.dropna())
"""
a 33.0
c 14.0
"""
# 给nan赋值为0
print(c.fillna(0))
"""
a 33.0
b 0.0
c 14.0
d 0.0
"""
# 填充平均值
print(c.fillna(c.mean()))
"""
a 33.0
b 23.5
c 14.0
d 23.5
"""
series小节
数组+字典
整数索引 loc 和iloc
数据对齐 nan
缺失值处理
- dropna
- fillna
dataframe创建 二维数据对象
import pandas as pd
a = pd.DataFrame({
'one': [1, 2, 3, 4],
'two': [6, 3, 2, 1],
})
print(a)
"""
one two
0 1 6
1 2 3
2 3 2
3 4 1
"""
print(a + 10) # 同样是支持加减乘除
"""
one two
0 11 16
1 12 13
2 13 12
3 14 11
"""
a = pd.DataFrame({
'one': [1, 2, 3, 4],
'two': [6, 3, 2, 1],
}, index=['a', 'b', 'c', 'd'])
print(a)
"""
one two
a 1 6
b 2 3
c 3 2
d 4 1
"""
# 读取文件
b = pd.read_csv('1_test.csv')
"""
个数,销量,人数
45,67,89
23,45,676
"""
print(b)
"""
个数 销量 人数
0 45 67 89
1 23 45 676
"""
# 变成csv
a.to_csv('2.test.csv')
常用属性
import pandas as pd
df = pd.DataFrame({
'one': [1, 2, 3, 4],
'two': [6, 3, 2, 1],
})
# 行索引
print(df.index)
"""
RangeIndex(start=0, stop=4, step=1)
"""
# 列索引
print(df.columns)
"""
Index(['one', 'two'], dtype='object')
"""
# 值
print(df.values)
"""
[[1 6]
[2 3]
[3 2]
[4 1]]
"""
# 转置
print(df.T)
"""
0 1 2 3
one 1 2 3 4
two 6 3 2 1
"""
print(df.describe())
"""
one two
count 4.000000 4.000000
mean 2.500000 3.000000
std 1.290994 2.160247
min 1.000000 1.000000
25% 1.750000 1.750000
50% 2.500000 2.500000
75% 3.250000 3.750000
max 4.000000 6.000000
"""
dataframe的索引与切片
import pandas as pd
df = pd.DataFrame({
'one': [1, 2, 3, 4],
'two': [6, 3, 2, 1],
})
print(df)
# 索引
print(df['one'][1]) # 2
print(df.iloc[0])
print(df.loc[1, 'one']) # 先写行,再写列
数据对齐与缺失值处理
import pandas as pd
df1 = pd.DataFrame({
'one': [1, 2, 3, 4],
'two': [6, 3, 2, 1],
}, index=['a', 'b', 'c', 'd'])
df2 = pd.DataFrame({
'one': [9, 5, 2, 1],
'two': [5, 5, 4, 4],
}, index=['a', 'b', 'c', 'd'])
df2['one']['c'] = float('nan')
c = df1 + df2
"""
a 10.0 11.0
b 7.0 8.0
c 5.0 6.0
d NaN NaN
e NaN NaN
"""
print(c)
print(c.fillna(0))
print(c.dropna()) # 会删掉这一整行
print(c.dropna(how='all')) # 删掉全是 nan的那一行
# 删除有缺失值的那一列
print(c.dropna(axis=1)) # 1 删除nan的列 默认是0
# 也可以使用自带的方法
c = df1.add(df2, fill_value=0)
print(c)
pandas常用函数
import pandas as pd
df = pd.DataFrame({
'one': [1, 2, 3, 4],
'two': [6, 3, 2, 1],
}, index=['a', 'b', 'c', 'd'])
# 计算的是每一列的平均值
print(df.mean())
"""
one 2.5
two 3.0
dtype: float64
"""
# 按照行求平均
print(df.mean(axis=1))
"""
a 3.5
b 2.5
c 2.5
d 2.5
dtype: float64
"""
# 对每一列求和
print(df.sum())
"""
one 10
two 12
dtype: int64
"""
# 排序 按照 two列降序
print(df.sort_values(by='two', ascending=False))
# 排序 按照 c行 降序
print(df.sort_values(by='c', ascending=False, axis=1))
# 有缺失值的不参与排序,统一放到最后
# 按照标签排序
print(df.sort_index(ascending=False))
时间处理对象
import datetime
from dateutil import parser
import pandas as pd
# 安装pandas之后就会有
# 字符串转时间对象
print(datetime.datetime.strptime('2022-01-14', '%Y-%m-%d'))
# 解析时间字符串
print(parser.parse('2022-01-04'))
print(parser.parse('2022/01/04'))
print(parser.parse('20220104'))
# 把批量字符串转换为时间对象
d_i = pd.to_datetime(['2021-01-12', '2021/01/13', '2021 01 14'])
print(d_i) # DatetimeIndex(['2021-01-12', '2021-01-13', '2021-01-14'], dtype='datetime64[ns]', freq=None)
生成时间对象
import pandas as pd
# 生成时间范围
date_list = pd.date_range('2022-01-04', '2022-01-14')
print(date_list)
# periods 个数
date_list = pd.date_range('2022-01-04', periods=10)
print(date_list)
# 时间跨度, 没小时
date_list = pd.date_range('2022-01-14', periods=10, freq='H')
print(date_list)
# 时间跨度,每周
date_list = pd.date_range('2022-01-14', periods=10, freq='W')
print(date_list)
# 时间跨度,每周一
date_list = pd.date_range('2022-01-14', periods=10, freq='W-MON')
print(date_list)
# 每一个小时20分钟
date_list = pd.date_range('2022-01-14', periods=10, freq='1h20min')
print(date_list)
# 时间跨度,非工作日
date_list = pd.date_range('2022-01-14', periods=10, freq='B')
print(date_list)
# 转成时间对象
print(date_list[0])
print(date_list[0].to_pydatetime())
时间序列
时间序列的切片操作
特别神奇且牛逼
import pandas as pd
import datetime
import numpy as np
# 从现在开始的每周一
date_list = pd.date_range(datetime.datetime.now(), periods=60, freq='W')
# 生成一维数组
sr = pd.Series(np.arange(60), index=date_list)
# 获取2023年的所有数据
print(sr['2023'])
# 获取2022年7月的所有数据
print(sr['2022-07'])
# 2022年12月至2023年2月的所有数据
print(sr['2022-12':'2023-02'])
# 重新采样, 统计每个月的和
print(sr.resample('M').sum())
# 重新采样, 统计每年的平均值
print(sr.resample('Y').mean())
文件处理
读取文件
import pandas as pd
data_list = pd.read_csv('./file/0117.csv')
# 指定某一列为行索引
# 选择第一列为行索引
data_list = pd.read_csv('./file/0117.csv', index_col=0)
# 选择date为行索引
data_list = pd.read_csv('./file/0117.csv', index_col='date')
# print(data_list)
# print(data_list.index)
# 这个时候,时间并不是时间序列
# 解析时间字符串
data_list = pd.read_csv('./file/0117.csv', index_col='date', parse_dates=True)
data_list = pd.read_csv('./file/0117.csv', index_col='date', parse_dates=['date'])
# print(data_list)
# 如果文件无列名
data_ = pd.read_csv(
'./file/0118_.csv',
header=None,
names=['id', 'date', 'num'],
index_col='date',
parse_dates=['date'])
print(data_)
"""
主要参数:
sep:指定分隔符
header=None:如果文件无列名
names: 指定列名
index_col:指定某列作为索引
skip_row:指定跳过某些行
na_values:指定某些字符串表示缺失值
parse_date: 指定某些列是否被解析为日期,类型为布尔值或列表
"""
写入文件
import pandas as pd
import numpy as np
lis = pd.DataFrame({
"id": np.arange(100),
'num': np.random.randint(20, 100)
}, index=pd.date_range('2021-09-21', periods=100, freq='W'))
lis.loc['2021-09', 'num'] = 'None'
print(lis)
# lis.to_csv('./file/to_.csv')
lis.to_csv('./file/to_.csv', header=False, index=False, na_rep=' ')
其他文件类型
读取Excel文件需要安装xlrd
pip install xlrd