首页 > 编程语言 >Python库-pandas详解

Python库-pandas详解

时间:2022-10-15 13:44:43浏览次数:62  
标签:02 index Python 索引 详解 2022 print data pandas

1. pandas介绍

 

pandas 是用于数据挖掘的Python库

 
  • 便捷的数据处理能力
  • 独特的数据结构
  • 读取文件方便
  • 封装了matplotlib的画图和numpy的计算

pandas的数据结构

  • Series
  • Series 类似表格中的一个列(column),类似于一维数组,可以保存任何数据类型。由索引(index)和列组成。
  • DataFrame
  • DataFrame 是一个表格型的数据结构,每列可以是不同的值类型(数值、字符串、布尔型值)。DataFrame 既有行索引也有列索引,它可以被看做由 Series 组成的字典。

案例应用

创建一个符合正态分布的10个股票5天的涨跌幅数据,使用pandas中的数据结构 DataFrame() 处理数据

 
# 导入库
import numpy as np
import pandas as pd

# 创建一个符合正态分布的10个股票5天的涨跌幅数据
stocks = np.random.normal(0, 1, [10, 5])
# 使用pandas中的数据结构 DataFrame() 处理数据
stocks_rise = pd.DataFrame(stocks)
# 设置行索引,获取行数 stocks_rise.shape[0] 进行遍历 列表生成式
index_row = ['股票{}'.format(i+1) for i in range(stocks_rise.shape[0])]
# 设置列索引,日期是一个时间序列,为了简便,使用pd.date_range()生成一组连续的时间序列
# pd.date_range(start,end,periods,freq) start:开始时间, end:结束时间
# periods:时间天数, freq:递进单位,默认1天,'B'默认略过周末
index_col = pd.date_range(start='20220201',periods=stocks_rise.shape[1],freq='B')
# 添加索引,注意数据是ndarray数据 index表示行索引,columns表示列索引
data = pd.DataFrame(stocks, index=index_row, columns=index_col)
print(data)

      2022-02-01  2022-02-02  2022-02-03  2022-02-04  2022-02-07
股票1    -2.054041   -1.170757    0.162393    0.253333   -1.638837
股票2    -1.463734    0.408459    0.530070   -0.925281    1.454630
股票3    -0.511517   -0.827591   -2.076265    0.139486    0.658707
股票4    -1.698789    0.250902   -0.624713    1.378845   -1.672292
股票5     0.683233   -1.083694    0.810567    0.421215    1.375385
股票6    -0.296111   -0.946959    0.836536   -1.179879   -0.397406
股票7     0.017772    0.180210    2.022776    0.436337   -1.555866
股票8     0.638262   -0.790932    1.077822   -1.746631   -0.591360
股票9    -0.681391   -0.613255   -1.849094    0.438304   -0.503742
股票10   -0.243500   -1.733623   -1.137840    0.124976   -0.415727

2. Series

 

pd.Series( data, index, dtype, name, copy)

参数说明:

data:一组数据(ndarray 类型)。
index:数据索引标签,如果不指定,默认从 0 开始。
dtype:数据类型,默认会自己判断。
name:设置名称。
copy:拷贝数据,默认为 False。

Series实例

# 通过数组创建Series
s = pd.Series([6, 5, 2], index=['x', 'y', 'z'])
print(s)
x    6
y    5
z    2
# 通过字典创建Series
s = pd.Series({
    'day': 2,
    'month': 2,
    'year': 2022
})
print(s)
day         2
month       2
year     2022
dtype: int64
# 通过索引操作数据
print(s['year'])
2022

3. DataFrame

 

3.1 DataFrame结构

 

DataFrame对象既有行索引,又有列索引

 
  • 行索引:表明不同行,横向索引,叫index,axis=0
  • 列索引:表明不同列,纵向索引,叫columns,axis=1

 

 

 

3.2 DataFrame属性与方法

 
  • shape DataFrame的形状
  • index DataFrame行索引
  • columns DataFrame列索引
  • values DataFrame的值
  • T DataFrame转置
  • head(n) DataFrame的前n行,默认为前5行
  • tail(n) DataFrame的后n行,默认为后5行
print(data.shape)  # (10, 5)
print(data.index)
# Index(['股票1', '股票2', '股票3', '股票4', '股票5', '股票6', '股票7', '股票8', '股票9', '股票10'], dtype='object')
print(data.columns)
# DatetimeIndex(['2022-02-01', '2022-02-02', '2022-02-03', '2022-02-04',
#                '2022-02-07'],
#               dtype='datetime64[ns]', freq='B')
print(data.values)
print(data.T)

3.2 DataFrame索引的设置

 

1 修改行列索引值

  • 必须整体全部修改,不能单独修改某个索引
 
index_row2 = ['股票_{}'.format(i + 1) for i in range(stocks_rise.shape[0])]
data.index = index_row2
print(data)

2 重设索引

 
  •  reset_index(drop=False)
    • 设置新的下标索引
    • drop:默认为False,不删除原来索引
# 重设索引
print(data.reset_index(drop=False))

3 以某列值设为新的索引

set_index(keys,drop=True)

  • keys:列索引名称或者列索引名称的列表
  • drop:默认为True,当作新的索引,删除原来索引
# 创建
df = pd.DataFrame({
    'month': [1, 4, 7, 10],
    'year': [2018, 2019, 2020, 2021],
    'sale': [55, 40, 84, 33]
})
print(df)
   month  year  sale
0      1  2018    55
1      4  2019    40
2      7  2020    84
3     10  2021    33
# 以月份设置新的索引
print(df.set_index('month'))
       year  sale
month            
1      2018    55
4      2019    40
7      2020    84
10     2021    33
# 设置多个索引,以年和月份
# 如果设置索引是两个的时候,就是multiIndex
print(df.set_index(['year', 'month']))
            sale
year month      
2018 1        55
2019 4        40
2020 7        84
2021 10       33

4. 基本数据操作

 

4.1 索引重命名

  •  rename(mapper=None,inplace=False)
    • mapper:映射结构,修改columns或index要传入一个映射体,可以是字典、函数
    • inplace:默认为False,不改变数据,返回一个新的DataFrame

4.2 通过索引操作数据

 

1. 直接使用行列索引(先列后行)

 
  • 先行后列会报错
  • 不支持切片,会报错
    stocks = np.random.normal(0, 1, [10, 5])
    stocks_rise = pd.DataFrame(stocks)
    index_row = ['股票{}'.format(i + 1) for i in range(stocks_rise.shape[0])]
    index_col = pd.date_range(start='20220201', periods=stocks_rise.shape[1], freq='B')
    data = pd.DataFrame(stocks, index=index_row, columns=index_col)
    print(data.head())
         2022-02-01  2022-02-02  2022-02-03  2022-02-04  2022-02-07
    股票1    0.663384    1.936687    1.992576    2.009280   -0.723381
    股票2   -2.441452    0.081647   -0.738524   -0.620358   -1.930378
    股票3    2.026646   -0.324842   -0.478456   -0.840363    1.492842
    股票4   -0.188968   -1.180816    0.733197   -0.078608   -1.056264
    股票5    1.219254   -1.738242    0.473682    0.288252    3.513113
    # 索引先列后行获取数据
    print(data['2022-02-03']['股票3'])
    -0.47845617563179627
    
    # print(data['股票3']['2022-02-03']) # 先行后列会报错
    # print(data[:1, :2]) # 不支持切片,会报错

     

2. 结合loc或iloc使用索引(先行后列)

 
  • loc 通过索引名称访问
  • iloc 通过索引下标访问,支持切片
print(data.loc['股票3']['2022-02-03']) 
print(data.iloc[1, 1])
print(data.iloc[:3, :4])
  • loc或iloc还可以进行组合索引访问
# 获取前5行,两列的值
print(data.loc[data.index[:5], ['2022-02-01', '2022-02-02']])
print(data.iloc[0:5, data.columns.get_indexer(['2022-02-01', '2022-02-02'])])

4.3 排序

 

1. sort_values(by=,ascending=) 对内容进行排序

 
  • by:根据单个键或者多个键(优先级从前到后)进行排序,默认升序 ascending=True
  • ascending=False,降序
print(data.sort_values(by='2022-02-01', ascending=False))
print(data.sort_values(by=['2022-02-01', '2022-02-02'], ascending=False))

2. sort_index(ascending=) 对索引进行排序

 
  • 默认升序 ascending=True, 降序为False
print(data.sort_index(ascending=False))
说明:Series的排序方法与DataFrame方法一致,因为只有一列,也不用指定键,只需要指定是升序或降序

5. DataFrame运算

 

5.1 算术运算

 

和一般算数运算方法类似,举几个例子

import pandas as pd
df = pd.DataFrame({
    'month': [1, 4, 7, 10],
    'year': [2018, 2019, 2020, 2021],
    'sale': [55, 40, 84, 33]
})
n = df['sale'][0]   # 55
print(n.__add__(2))    # 加法运算 <=> +
print(n.__sub__(2))    # 减法运算 <=> -
print(n.__mul__(2))    # 乘法运算 <=> *
print(n.__divmod__(2)) # 除余,得到商和余数 (商, 余数)
print(n.__mod__(2))    # 模运算(余数)<=> %
print(n.__abs__())    # 绝对值运算

5.2 逻辑运算

 逻辑运算符号 < > | &
  • 获取逻辑运算结果
  • 将逻辑运算结果作为筛选条件进行数据筛选
print(df)
   month  year  sale
0      1  2018    55
1      4  2019    40
2      7  2020    84
3     10  2021    33
# 获取逻辑运算结果
print(df['sale'] > 50)
0     True
1    False
2     True
3    False
# 逻辑运算结果可以作为筛选的条件
print(df[df['sale'] > 50])  
Name: sale, dtype: bool
   month  year  sale
0      1  2018    55
2      7  2020    84

逻辑运算函数

  • query(expr) 通过条件字符串进行查询符合条件的数据
  • isin(values) 对数据进行逻辑判断,判断数据是否在指定的values中

5.3 统计运算

 
  • describe() 综合分析,统计数量count,平均值mean,标准差std,最大值,最小值等
    print(data.head().describe())
           2022-02-01  2022-02-02  2022-02-03  2022-02-04  2022-02-07
    count    5.000000    5.000000    5.000000    5.000000    5.000000
    mean     0.731207    0.016387   -0.292730   -0.050105    0.491857
    std      0.692347    1.184870    1.038632    0.897436    0.808612
    min     -0.019900   -1.273726   -1.526506   -0.766793   -0.416006
    25%      0.558542   -0.963643   -1.228403   -0.563485    0.043999
    50%      0.581686   -0.036380   -0.031193   -0.553368    0.136538
    75%      0.665749    0.797005    0.541065    0.229670    1.331016
    max      1.869961    1.558681    0.781386    1.403449    1.363740

     

  • 描述性统计函数

对于单个函数去统计的时候,坐标轴还是按照默认columns(axis=0),如需要对行统计,指定axis=1

 

 

 

  • 其他统计函数

 

 

5.4 自定义运算

 

apply(func,axis)

 
  • func:自定义运算函数
  • axis:默认为0,对列运算

6. pandas画图

 

对象.plot(x=None,y=None,kind=‘line’)

  • x和y表示标签或者位置,默认为None
  • kind:表示绘图的类型,默认为line,折线图
    • bar/barh:柱状图
    • hist:直方图
    • line:折线图
    • pie:饼状图
    • area:区域图
    • scatter:散点图
import matplotlib.pyplot as plt

rise = data.loc['股票1'].cumsum()
print(rise)
rise.plot()    # 画图
plt.show()    # 显示

 

 

7. 文件的读取和存储

 

pandas支持的常用文件类型包括:HDF5、CSV、SQL、XLS、JSON等

 

1.CSV

 
  • pd.read_csv(‘filepath_or_buffer’, usecols=[]) 读取csv文件数据
    • filepath_or_buffer:文件路径
    • sep:分隔符,默认为’,’
    • usecols:指定读取的列名,列表形式
import pandas as pd

data = pd.read_csv(r'../../fodder/stocks.csv', usecols=['open', 'high', 'low', 'close'])
print(data.head())
    open   high    low  close
0  29.76  29.97  29.52  29.96
1  28.49  29.51  28.42  29.50
2  28.76  28.95  28.47  28.50
3  28.41  28.95  28.32  28.90
4  28.37  28.61  28.33  28.36

 

  • df.to_csv(path_or_buf,columns=[],index=True,mode=‘w’) 将数据存储到csv文件中
    • path_or_buf:文件存放的路径
    • sep:分隔符,默认为’,’
    • columns:列,列表形式
    • mode:‘w’:重写,‘a’:追加
    • header:是否写进列索引值
    • index:是否写进行索引,默认True写进行索引,会将行索引变成一列数据
    • encoding:编码格式,默认为None
# 将前十行数据写进新的文件中 index设置False,不写行索引
data[:10].to_csv(r'../../fodder/test.csv', columns=['open', 'close'], index=False)
# 查看写进文件的数据
data2 = pd.read_csv(r'../../fodder/test.csv')
print(data2)
    open  close
0  29.76  29.96
1  28.49  29.50
2  28.76  28.50
3  28.41  28.90
4  28.37  28.36
5  27.48  28.34
6  27.66  27.84
7  28.03  27.55
8  28.65  28.37
9  28.39  28.84

2.HDF5

 

读取HDF5文件(.h5)需要安装tables模块

 

 
  • pd.read_hdf(path_or_buf, key=None) 读取HDF5文件
    • path_or_buf:文件路径
    • key:读取的键
 
  • df.to_hdf(path_or_buf, key) 写入HDF5文件
    • path_or_buf:文件路径
    • key:写入文件时,必须指定一个键
      # 读取.h5文件数据
      data = pd.read_hdf(r'../../fodder/stocks.h5')
      print(data.head())
      # 将数据写入.h5文件
      data.to_hdf(r'../../fodder/test.h5', key='a')
      data2 = pd.read_hdf(r'../../fodder/test.h5', key='a')
      print(data2.head())

       

      3.JSON

       
  • pd.read_jsonf(path_or_buf, orient=None,typ=‘frame’,lines=False) 读取json文件
    • path_or_buf:文件路径
    • orient:指定数据存储的json形式 ,{‘split’,‘records’,‘index’,‘columns’,‘valuse’}
    • typ:默认frame,指定转换成的对象类型Series或者DataFrame
    • lines:默认False,按照每行读取json
      • pd.to_jsonf(path_or_buf, orient=None,lines=False) 存储json文件
  • path_or_buf:文件路径
  • orient:指定数据存储的json形式
  • lines:默认False,一个对象存储为一行。一般设置为Ture

 

# 读取json文件
data = pd.read_json(r'../../fodder/33510.json', orient='records', lines=True)
print(data.head())
# 写入json文件
data.to_json(r'../../fodder/test.json', orient='records', lines=True)
data2 = pd.read_json(r'../../fodder/test.json')
print(data2.head())

8. 数据的高级处理

 

8.1 缺失值处理

 

缺失值NaN的类型是float

print(type(np.NAN))
<class 'float'>

1. 判断数据是否有缺失值

 
  • pd.isnull(df)
  • pd.notnull(df)
# 读取xls数据
data = pd.read_excel(r'../Python/demo/reptile/豆瓣电影TOP250/豆瓣电影TOP250.xls')
# 只要包含缺失值,就为True
np.any(pd.isnull(data))     # True

 

2. 处理NaN

 
  • 删除缺失值 dropna(inplace=False),前提是缺失值的类型必须是np.NaN
# dropna()方法可以指定是否在原数据上进行删除 默认inplace=False 不修改原数据
newdata = data.dropna()  
np.any(pd.isnull(newdata))     # False

替换缺失值 fillna(value,inplace=False)









  • value:替换后的值、
  • inplace:默认False,表示不改变原数据,True表示在原数据上直接替换
for item in data.columns:
#     print(item) # 遍历所有列索引
    # 判断该列中是否含有缺失值
    if np.any(pd.isnull(data[item])): 
#         print(item)
        # 对该列中的缺失值进行替换
        data[item].fillna(value="this is queshizhi", inplace=True)

3. 缺失值不是NaN的情况,如默认标记符号

 

比如数据中存在"?"符号,则可以先将符号替换为NaN,再进行处理。

 替换 replace(to_replace,value) ,在原数据上直接替换
  • to_replace:替换前的值
  • value:替换后的值
# 替换为np.NaN
data.replace(to_replace="?", value=np.NaN)
# 删除缺失值 在原数据上直接删除
data.dropna(inplace=True)

 

标签:02,index,Python,索引,详解,2022,print,data,pandas
From: https://www.cnblogs.com/tuixiulaozhou/p/16794015.html

相关文章