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 2024-01-23 21:44  会飞的金鱼  阅读(74)  评论(0)    收藏  举报