前言
Pandas的两种数据结构(pandas是基于Numpy来进行构建的,让以Numpy为中心的应用变得更加的简单)
一、Pandas简介
1-1、Series(类似一维数组的对象,由values和index组成,及由数据和索引构成):
1-1-1、使用
import pandas as pd from pandas import Series,DataFrame obj = Series(['a', 'b', 'c'], index=[1, 2, 3]) # 我们也可以把Series当作字典来使用,这时候,Series中的索引就是字典中的键。
1-1-2、切片
标签索引(即行和列的名称): loc[]
整型索引(几行几列,起始索引为0): iloc[]
import pandas as pd df = pd.DataFrame({'a': [1, 2, 3], 'b': ['a', 'b', 'c'],'c': ["A","B","C"]}) print(df) a b c 0 1 a A 1 2 b B 2 3 c C # 选择多行 # 选择1到2行,选择所有列 print(df.loc[1:2,:]) a b c 1 2 b B 2 3 c C
1-2、DataFrame(是一个表格型的数据结构,索引既有行索引也有列索引):
1-2-1、构建
import pandas as pd from pandas import Series,DataFrame # 左边是列索引。 data = { '60年代': {'狗子', '嘎子', '秀儿'}, '70年代': {'卫国', '建国', '爱国'}, } frame_data = DataFrame(data) # T:转置操作。 frame_data.T
1-2-2、查询操作:
1、单个label值查询:df.loc[行名,列名]
2、使用值列表批量查询: df.loc[[多行名],列名]
3、使用数值区间范围查询:df.loc[起始行名:结尾行名,列名]
4、使用条件表达式查询:df.loc[行名判断筛选,列名]
备注:如果有多个条件的话,可以使用添加与或非连接他们。
5、调用函数查询:
1-2-3、pandas新增数据列:
1、直接赋值
# 1、直接赋值 # 增加一行,都赋值为4 df.loc[3,:]=4
2、apply(函数): 映射,赋予某种函数关系。
3、assign
4、分条件赋值
5、在df中插入新的series
# 假设有df和series # 第一步要确保的是他们的length是相等的。 # 第二步,确保他们的索引是相等的,这里可以重置一下索引 df = df.reset_index(drop=True) # 这里必须要加drop=True,表示删除原来的索引列,不然会在数据表格中新生成一列'index'数据 series = series.reset_index(drop=True) # 插入series # 第一个必须写0,即插入第一列,否则会报错,第二个参数是新列的名字,第三个参数是对应的series。 df.insert(0, 'series', series)
1-2-4、处理丢失数据:
1、判断是否非空 isnull() 例如:pd.isnull(要判断的数据)
2、notnull()
3、过滤函数 dropna()
4、填充函数 fillna()
其他注意:
1、None与NaN
pandas中None和np.nan都视为np.nan。
numpy中None不参与运算。
2、填充方式
均值填充
向前填充、向后填充(使用到了fillna里的参数method)
线性差值填充 (np.linspace(开始值,结束值,分为多少份))
1-2-5、删除行、列
# 删除第0行。 df.drop(0,axis=0,inplace=True) # inplace默认为False,如果为True则表示替换原dataframe # 删除第0列。 df.drop(0,axis=1,inplace=True)
1-2-6、更改列名
# 把列名s改为c df.rename(columns={’s’:’c’}, inplace=True) # inplace默认为False,如果为True则表示替换原dataframe
1-2-7、分组和合并、过滤:
1、分组:groupby()
2、过滤:filter()
3、汇总操作:aggregate()
1-2-8、表格匹配与拼接:
1、concatenate(concat()函数)
2、append
3、合并:merge()
4、join()
1-2-9、文件读取(read_csv、read_excell、read_sql):
read_csv():
# 默认分隔符为逗号 import pandas as pd # skiprows:跳过哪一行数据 # header: 默认把第一行当作头部,如果指定header为None,则自动生成头部。 # nrows: 指定读取行数,只读取几行。(针对比较大的文件) # sep: 指定分隔符是什么 # index_col: 直接读取会使文件中第一列数据默认为df的index,使列名和列数据发生错位。可以添加以下参数:int or sequence or False,default None dd = pd.read_csv('dd.csv', skiprows=[0], header=None, nrows=5)
read_excell():
# sheet_name: 指定工作表 # 其他参数: # header: 表示用第几行作为表头,默认header=0,即默认第一行作为表头, header=None,表示不使用数据源中的表头。 # header为1,即选择第二行作为表头,其上的数据就不要了。 # names: 表示自定义表头名称,需要传递数组参数 # index_col: 指定列为索引列,默认为None。 index_col=0,指定第0列为索引列 excel = pd.read_excel('data_excel.xlsx', sheet_name='工作表') # plot根据excel绘制图表, # kind: 绘制模式 excel.plot(kind = 'scatter', x='age', y='place').get_figure() # notice: 经过验证,通常情况下来说csv格式的文件要比excel格式类型的文件大的多。 # df: 读取的文件一般都保存为DataFrame格式的文件。 # parse_dates=True 尝试将格式解析成日期格式,解析不成功也不会出错,只按原格式输出
read_sql()
# 读取SQL语句,conn为数据库引擎,返回值是DataFrame。 conn = psycopg2.connect(host='*******', user='******', password='*******', dbname='*******', port=*******) sql = f'select * from ljl_temp."{table}"' df = pd.read_sql(sql, conn) conn.close()
1-2-11、索引重置reset_index():
注意:索引重置reset_index()可以获得新的index,原来的index变成数据列,保留下来。
不想保留原来的index,使用参数 drop=True,默认 False。
import pandas as pd import numpy as np df = pd.DataFrame(np.arange(20).reshape(5,4),index=[1,3,4,6,8]) print(df) print(df.reset_index(drop=False)) # drop参数默认为False # 如果需要直接使用重置后的索引,则需要直接把drop改为True,即把原来的index直接删掉。 # inplace = True: 直接替换掉原表。
1-2-13、确认数据出现的频率
# value_counts(): 可以对dataframe中的每个值进行计数并且排序 # ascending: 是否升序排列,bool类型参数 # normalize: 是否统计占比,bool类型参数 df['区域'].value_counts(normalize=True) # 上海:0.7 # 深圳:0.1 # 广西:0.1 # 山西:0.1 df['区域'].value_counts() # 上海:70 # 深圳:10 # 广西:10 # 山西:10 # 注意:df['区域']是series类型,如果是dataframe类型进行数据统计 df.apply(pd.value_counts)
1-2-14、日期生成date_range()
含义:用于生成一个固定频率的DatetimeIndex的时间索引
date_range(start=None, end=None, periods=None, freq=None, tz=None, normalize=False, name=None, closed=None, kwargs)
参数介绍
start:指定生成时间序列的开始时间
end:指定生成时间序列的结束时间
periods:指定生成时间序列的数量
freq:生成频率,默认‘D’,可以是’H’、‘D’、‘M’、‘5H’、‘10D’
close: 选择是否包含开始和结束时间,left包含开始时间,不包含结束时间,right与之相反。默认同时包含开始时间和结束时间。
# 指定起始时间 pd.date_range('20200101', '20200110') # 或者是只是指定开始或者是结束时间,加一个参数periods。 # pd.date_range('20200101', periods=10)
输出:
DatetimeIndex([‘2020-01-01’, ‘2020-01-02’, ‘2020-01-03’, ‘2020-01-04’,
‘2020-01-05’, ‘2020-01-06’, ‘2020-01-07’, ‘2020-01-08’,
‘2020-01-09’, ‘2020-01-10’],
dtype=‘datetime64[ns]’, freq=‘D’)
其他操作:
其他参数: method: (ffill 前向值填充 bfill 后向填充)
2、排序: sort_values(), sort_index()
3、日期生成:data_range(‘20200101’, periods=6)
4、stack(): stack函数会把列索引转成行索引,即把列索引换成二级的行索引,即所有列压缩到一列。
# shift+tab查看函数源码 datas = pd.date_range('20211222', periods=7) pd.DataFrame(np.random.randn(7,4), index=datas, columns=['a', 'c', 'b', 'f'])
总结
这个后续慢慢补充吧!