数据分析-pandas
pandas介绍 基于numpy构建的 主要功能: 具备对其功能的数据结构DataFrame,Series 集成时间序列功能 提供丰富的数学运算和操作 灵活处理缺失数据 安装 pip i

数据分析-pandas

发布时间:2024-04-02 (2024-04-02)

pandas介绍

基于numpy构建的

主要功能:

  1. 具备对其功能的数据结构DataFrame,Series
  2. 集成时间序列功能
  3. 提供丰富的数学运算和操作
  4. 灵活处理缺失数据

安装

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