DataFrame对象既有行索引,又有列索引。行索引,表明不同行,横向索引,叫index,0轴,axis=0。列索引,表明不同列,纵向索引,叫columns,1轴,axis=1。
import pandas as pd import numpy as np # 创建DataFrame t1=pd.DataFrame(np.arange(12).reshape(3,4)) print(t1) ''' 0 1 2 3 0 0 1 2 3 1 4 5 6 7 2 8 9 10 11 ''' print('*'*50) t2=pd.DataFrame(np.arange(12).reshape(3,4),index=list('abc'),columns=list('wxyz')) print(t2) ''' w x y z a 0 1 2 3 b 4 5 6 7 c 8 9 10 11 ''' print('*'*50) d1={"name":['tom','jerry'],'age':[20,21],'tel':[10080,10086]} t3=pd.DataFrame(d1) print(t3) ''' name age tel 0 tom 20 10080 1 jerry 21 10086 ''' l=[{'name':'tom','age':20,'tel':10080},{'name':'jerry','age':21,'tel':10086}] t4=pd.DataFrame(l) print(t4)
基本属性和常用方法
import numpy as np import pandas as pd df=pd.DataFrame(data=np.arange(12).reshape(3,4),index=list('abc'),columns=list('wxyz')) print(df) ''' w x y z a 0 1 2 3 b 4 5 6 7 c 8 9 10 11 ''' # DataFrame基础属性 print('索引',df.index) # 行索引 Index(['a', 'b', 'c'], dtype='object') print('列',df.columns) # 列索引 Index(['w', 'x', 'y', 'z'], dtype='object') print('值',df.values) # 对象值 二维ndarray数组 print('形状',df.shape) # 行数,列数 (3, 4) print('列数据类型',df.dtypes) # 列数据类型 ''' w int32 x int32 y int32 z int32 dtype: object ''' print('数据维度',df.ndim) # 数据维度 2 # DataFrame整体情况查询 print(df.head(2)) # 显示头部几行 默认为5行 print(df.tail(2)) # 显示尾部几行 默认为5行 print(df.info()) # 相关信息概览 行数,列数 列索引,列非空值格式等 print(df.describe()) # 快速综合统计结果 计数,均值,标准差,最大值,四分位数,最小值 # DataFrame排序 sort_values() df.loc['a']['z']=11 df.loc['c']['y']=1 print(df) df=df.sort_values(by=['z','y'],ascending=False) print(df)
pandas访问数据
1,df.loc通过标签索引行数据
2,df.iloc通过为止获取行数据
import pandas as pd import numpy as np df=pd.DataFrame(data=np.arange(12).reshape(3,4),index=list('abc'),columns=list('wxyz')) print(df) print('*'*50) # df.loc[] 通过标签访问 : 在此处是闭合的 这里是针对字符串 print(df.loc['a']) # 访问一行数据 print(df.loc['a':'c']) #访问多行数据 print(df.loc['a':'c',:]) #访问多行数据 print(df.loc[['a','c']]) # 访问指定的行数据 print(df.loc[['a','c'],:]) # 访问指定的行数据 print('*'*50) print(df.loc[:,'x']) # 访问一列数据 print(df.loc[:,'w':'z']) # 访问连续列数据 print(df.loc[:,['x','z']]) # 访问指定列数据 print(df.loc['a','z']) # 访问某个位置的数据 print(df.loc[['b','c'],['x','z']]) # 访问多行多列的位置数据 与numpy切片有所不同 ''' x z b 5 7 c 9 11 ''' print('*'*50) # iloc 通过位置访问 : 此处是左闭右开 print(df.iloc[0]) # 访问一行数据 print(df.iloc[1:2]) #访问多行数据 print(df.iloc[1:2,:]) #访问多行数据 print(df.iloc[[0,2]]) #访问指定的行数据 print(df.iloc[[0,2],:]) #访问指定的行数据 print('*'*50) print(df.iloc[:,0]) #访问一列数据 print(df.iloc[:,0:4]) # 访问连续列数据 print(df.iloc[:,[1,3]]) # 访问指定列数据 print(df.iloc[0,3]) # 访问某个位置的数据 print(df.iloc[[0,1],[2,1]]) # 访问多行多列的位置数据 与numpy切片有所不同
布尔索引
import pandas as pd import numpy as np df=pd.DataFrame(data=np.arange(12).reshape(3,4),index=list('abc'),columns=list('wxyz')) print(df) print(df[df>5]) # 布尔索引 多个条件用 &(并且) 或 |(或)连接 print(df[df['y']<8]) print(df[(df['y']<8) | (df['x']>4)]) print(df[(df['y']<8) & (df['x']>4)]) # 注意:不同条件之间需要用括号括起来
pandas中字符串方法
| 方法 | 说明 |
| cat | 实现元素级的字符串连接操作。可指定分隔符 |
| contains | 返回表示个字符串是否含有指定模式的布尔型数据 |
| count | 模式的出现次数 |
| endswith,startswith | 相当于对各个元素之星x.endswith(patten)或x.startswith(pattern) |
| findall | 计算各字符串的模式列表 |
| get | 获取各元素的第i个字符 |
| join | 根据指定的分隔符将Series中各元素的字符串连接起来 |
| len | 计算个字符串的长度 |
| lower、upper | 转换大小写,相当于对各个元素执行x.lower()或x.upper() |
| match | 根据指定的正则表达式对各个元素执行re.match |
| pad | 在字符串的左边、右边或左右两边添加空白符 |
| center | 相当于pad(side='both') |
| repeat | 重复值。相当于字符串执行x*重复次数 |
| replace | 用指定字符串替换找到的模式 |
| slice | 对Series中的各个字符串进行子串截取 |
| split | 根据分隔符或正则表达式对字符串进行拆分 |
| strip,rstrip,lstrip | 去除空白符,包括换行符。 |
缺失数据的处理
1,先判断数据是否为NaN:pd.isnull(df),pd.notnull(df)
2,处理方式:
1)删除NaN所在的行列dropna(axis=0,how='any',inplace=False)
2)填充数据,t.fillna(t.mean()),t.fillna(t.median()),t.fillna(0)
有时候处理为0的数据 t[t==0]=np.nan,当然并不是每次为0的数据都需要处理。计算平均值等情况,nan是不参与计算的,但是0会。
import pandas as pd import numpy as np df=pd.DataFrame(np.arange(12).reshape(3,4),index=list('abc'),columns=list('wxyz')) print(df) df.loc['a','y':'z']=np.nan df.loc['a':'b','x']=np.nan print(df) print('*'*50) # 判断是否是nan pd.isnull(df) 或pd.notnull(df) print(pd.isna(df)) print(pd.notna(df)) print(pd.isnull(df)) print(pd.notnull(df)) #1,删除行或列 dropna()方法 axis:轴(0,1) how:'any'表示只要有一个NaN就删除,'all'表示所有都是才删除。 inplace:是否作用到原数据上 df1=df.dropna(axis=0,how='any') print(df1) df2=df.dropna(axis=1,how='any') print(df2) # df.dropna(axis=1,how='any',inplace=True) # print(df) print('*'*50) #2,填充数据 df.loc[:,'y'].fillna(df.loc[:,'y'].mean(),inplace=True) print(df.loc[:,'y']) print(df) print(df.loc['a',:].mean()) print(df.loc['a',:]) df=df.loc['a',:].fillna(df.loc['a',:].mean()) print(df)
数据合并join
join:默认情况下把行索引相同的数据合并到一起。
import pandas as pd import numpy as np df1=pd.DataFrame(np.zeros((3,4)),index=list('abc'),columns=list('abcd')) df2=pd.DataFrame(np.zeros((2,3)),index=list('ab'),columns=list('abc')) # 数据合并 join 相当于mysql中left join 以左边的数据为准,右边没有关联的数据则数据为NaN, # 另外列名相同,需要重命名 df3=df1.join(df2,lsuffix='l',rsuffix='r') print(df3) df4=df2.join(df1,lsuffix='l',rsuffix='r') print(df4)
数据合并merge
merge:按照指定的列把数据按照一定的方式合并到一起。
import pandas as pd import numpy as np d1=[{'userid':'a','age':23},{'userid':'b','age':46},{'userid':'c','age':32}] d2=[{'userid':'a','payment':2000},{'userid':'c','payment':3500}] df1=pd.DataFrame(d1) df2=pd.DataFrame(d2) print(df1) ''' userid age 0 a 23 1 b 46 2 c 32 ''' print(df2) ''' userid payment 0 a 2000 1 c 3500 ''' print('*'*50) # merge有四种类型 'inner'、'left'、'right'、'outer' # inner 交集 df3=df1.merge(right=df2,how='inner',on='userid') print(df3) ''' userid age payment 0 a 23 2000 1 c 32 3500 ''' print('*'*50) # outer 并集 缺失值为NaN df4=df1.merge(right=df2,how='outer',on='userid') print(df4) ''' userid age payment 0 a 23 2000.0 1 b 46 NaN 2 c 32 3500.0 ''' print('*'*50) # left 以左边为准 缺失值为NaN df5=df1.merge(right=df2,how='left',on='userid') print(df5) ''' userid age payment 0 a 23 2000.0 1 b 46 NaN 2 c 32 3500.0 ''' print('*'*50) # right 以右边为准 缺失值为NaN df6=df1.merge(right=df2,how='right',on='userid') print(df6) ''' userid age payment 0 a 23 2000 1 c 32 3500 '''
分组和聚合
grouped=df.groupby(by='columns_name')
grouped是一个DataFrameGroupBy对象,是可迭代的,每一个元素时一个元组,元组里面是(索引(分组的值),分组之后的DataFrame)
时间序列
生成一段时间范围
import pandas as pd import numpy as np # pd.date_range(start=None,end=None,periods=None,freq='D') # start和end以及freq配合能够生产start和end范围内以频率freq的一组时间索引 # start和periods以及freq配合能够生产从start开始的频率为freq的periods个时间索引 d=pd.date_range(start='20240101',end='20240323',freq='10D') print(d) ''' DatetimeIndex(['2024-01-01', '2024-01-11', '2024-01-21', '2024-01-31', '2024-02-10', '2024-02-20', '2024-03-01', '2024-03-11', '2024-03-21'], dtype='datetime64[ns]', freq='10D') ''' d1=pd.date_range(start='20240101',periods=5,freq='10D') print(d1) ''' DatetimeIndex(['2024-01-01', '2024-01-11', '2024-01-21', '2024-01-31', '2024-02-10'], dtype='datetime64[ns]', freq='10D') ''' # 使用时间序列作为索引 index=pd.date_range(start='20240101',periods=5) df=pd.DataFrame(np.arange(5),index=index) print(df) ''' 0 2024-01-01 0 2024-01-02 1 2024-01-03 2 2024-01-04 3 2024-01-05 4 ''' # df['time']=pd.to_datetime(df['time'],format='') # format就是要转换的时间格式
| 别名 | 偏移量类型 | 说明 |
| D | Day | 每日历日 |
| B | BusinessDay | 每工作日 |
| H | Hour | 每小时 |
| T或min | Minute | 每分钟 |
| S | Second | 每秒钟 |
| L或ms | Milli | 每毫秒(即每千分之一秒) |
| U | Micro | 每微秒(即每百万分之一秒) |
| M | MonthEnd | 每月最后一个日历日 |
| BM | BusinessMonthEnd | 每月最后一个工作日 |
| MS | MonthBegin | 每月第一个日历日 |
| BMS | BusinessMonthBegin | 每月第一个工作日 |
重采样:指的是将时间序列从一个频率转化为另一个频率进行处理的过程,将频率数据转化为低频率数据为降采样,低频率转化为高频率为升采样。
resample方法实现频率转化。
t=pd.DataFrame(np.random.uniform(10,50,(5,1)),index=pd.date_range('20240101',periods=5)) print(t) print(t.resample('2D').count()) ''' 0 2024-01-01 2 2024-01-03 2 2024-01-05 1 ''' print(t.resample('M').mean()) ''' 0 2024-01-31 31.371969 '''
posted on
浙公网安备 33010602011771号