Pandas数据分析库——详细解构
2024-10-14 22:53:11 0 举报
AI智能生成
Pandas是Python中的一个强大且灵活的数据分析库,广泛应用于数据操作和清洗、时间序列分析、统计分析和数据可视化等领域。它提供了一种灵活高效的数据结构——DataFrame,支持行列索引,类似于Excel的表格。DataFrame还支持加载和存储多种格式的数据文件,如CSV、Excel、JSON、HDF5等。此外,Pandas还内置了许多实用的函数,如数据排序、聚合、连接等,方便用户对数据进行处理和分析。通过Pandas,你可以进行复杂的数据分析任务,例如分组聚合、时间序列分析、缺失值填充、数据转换等。总的来说,Pandas是一个功能强大的数据分析工具,能够为数据科学家、分析师、开发人员等相关领域人员提供实质帮助。
作者其他创作
大纲/内容
8. 数据重塑
转置
df.T
多层索引
pd.MultiIndex.from_product([list('ABCDEFG'),['期中', '期末'])
行旋转成列
df.unstack(level = -1),level指定哪一层,0表示第一层,-1表示最后一层,默认是-1
列旋转成行
df.stack()
多层索引的计算
df.mean(level = 0),level表示哪一层
9. 数学和统计方法
简单统计指标
统计非空数据数量:df.count()
最大最小值:df.max(), df.min()
平均值:df.mean()
中位数:df.median()
求和:df.sum()
分位数:df.quantile(q = [0.2 ,0.4 , 0.6])
汇总统计:df.describe()
索引标签、位置获取
最大值索引:df['Python'].argmax()
最小值索引:df['Python'].argmin()
最大值的标签:df.idxmax()
最小值标签:df.idxmin()
更多统计指标
统计元素出现次数:df['Python'].value_counts()
去重:df['Python'].unique()
累加和:df.cumsum()
累乘和:df.cumprod()
累计最小值:df.cummin()
累计最大值:df.cummax()
标准差:df.std()
方差:df.var()
差分,即与上个数据相减:df.diff()
计算 百分比变化:df.pct_change()
协方差:df.cov()
两属性的协方差:df['Python'].cov(df['En'])
相关性系数:df.corr()
单一属性相关性系数:df.corrwith(df['Python'])
10. 排序
索引排序
df.sort_index(axis = 0, ascending = True),按照索引升序
列名排序
df.sort_index(axis = 1, ascending = False),按照列名降序
属性值排序
df.sort_values(by=['Python', 'EN']),先按照Python排序,再按照EN排序
字符串排序
首先将str转为category类型job.astype('category'),然后赋值一个list_custom=[ ],其中是排列顺序,然后job.cat.reorder_categories(list_custom, inplace=True),最后再job.sort_values()
获取最大10个数据
df.nlargest(10, columns='Python')
获取最小10个数据
df.nsmallest(10, columns='Python')
11. 分箱操作
分箱操作就是将连续数据转换为分类对应物的过程,如将连续身高数据划分为矮中高
分箱操作也叫面元划分或者离散化,分为等距分箱和等频分箱
等距分箱
pd.cut(df.Python, bins = 4, labels = ['不及格', '及格', '中等', '优秀'], right = True),其中bins为等距分成4份,bins也可=[0,60,90],labels为分类,right=True为左闭右闭
等频分箱
pd.qcut(df.Python, q = 4, labels = ['不及格', '及格', '中等', '优秀']),其中q为4等分
分箱后,可以直接.value_counts()来统计每份的数量
12. 分组聚合
分组
先分组,再迭代获取数据
g = df.groupby(by='sex')
for x, y in g:
print(x)
print(y)
df.groupby(by = 'class')['Python']也可以写成df['Python'].groupby(df['class'])
多分组
df.groupby(by = ['sex', 'class'])
按数据类型分组
df.groupby(df.dtypes, axis = 1)
通过字典进行分组
m = {'sex':'catagory', 'class':'catagory', 'Python' = 'IT', 'Keras' = 'IT'}
for x, y in df.groupby(m, axis = 1):
print(x)
print(y)
for x, y in df.groupby(m, axis = 1):
print(x)
print(y)
分组聚合
分组直接调用函数进行聚合
df.groupby(by='sex').mean().round(1),根据sex分组,求平均值,保留一位小数
df.groupby(by=['sex', 'class']).size(),根据sex和class进行分组,统计每个班男女人数
分组聚合apply
聚合结果变少
df.groupby(by = ['class', 'sex']).apply(np.mean)
分组聚合transform
聚合结果和原数据shape一样
df.groupby(by = ['class', 'sex']).transform(np.mean)
分组聚合agg
apply和transform只能计算一种统计,agg可以多种统计
不同列进行相同计算
df.groupby(by = ['class', 'sex']).agg([np.max,np.min,pd.Series.count])
不同列进行不同计算
df.groupby(by = ['class','sex']).agg({'Python':[('最大值', np.max), ('最小值', np.min)], 'En':[('计数', pd.Series.count), ('中位数', np.median)]})
透视表
类似于Excel透视表
df.pivot_table(values = ['Python', 'En'], index = ['class', 'sex'], aggfunc = {'Python': [('最大值', np.max)], 'En':[('最小值', np.min), ('中位数', np.median)]}) ,其中values表示要透视的值,index表示分组,aggfunc表示聚合运算
13. 时间序列
时间戳操作
创建方法
时刻数据
pd.Timestamp('2020-9-1 12'),表示2020年9月1日12点
时期数据
pd.Period('2020-9-1', freq='M'),表示一段时间,即2020年9月
批量时刻数据
pd.date_range('2020-9-1', freq = 'D', periods = 10),表示从2020年9月1日往后的10天时刻
批量时期数据
pd.period_range('2020-9-1', periods = 10, freq = 'M'),表示2020年9月1日往后的10个月份
转换方法
pd.to_datetime('2020.09.01'),将其他类型转换成日期类型2020-09-01
pd.to_datetime(1600171606, unit='s'),将时间戳转变成世界标准时间
x + pd.DateOffset(days = 8),8天后时间
时间戳索引
时间戳索引
ts = pd.Series(np.random.randint(0,10,size=10), index=批量时刻数据)
str类型索引
ts['2020-09-01'],获取2020年9月1日的数据
ts['2020-9'],获取2020年9月份数据
ts['2020-9-15':'2020-9-20'],获取9月15到20日数据
ts['2020-9'],获取2020年9月份数据
ts['2020-9-15':'2020-9-20'],获取9月15到20日数据
时间戳索引
ts[pd.Timestamp('2020-9-1')],[]中为时间戳操作
时间戳索引属性
ts.index.year 获取年
ts.index.dayofweek 获取一周中的第几天
ts.index.weekofyear 获取一年中第几周
ts.index.dayofweek 获取一周中的第几天
ts.index.weekofyear 获取一年中第几周
时间序列常用操作
数据移动
ts.shift(periods=2),数据向后移动2
ts.shift(periods=-2),数据向前移动2
日期移动
ts.shift(periods=5, freq=pd.tseries.offsets.Day()),时间后移5天
频率转换
ts.asfreq(pd.tseries.offsets.Week()),变成周
不是累加值,只是获取数据
当由天变小时,因为是由少变多,则可以添加fill_value = 0来填充值
重采样
日期为索引,就是根据日期维度分组聚合
ts.resample('2W').sum(),以2周为单位进行汇总
ts.resample('3M').sum().cumsum(),以季度为单位进行汇总
DataFrame重采样
日期不是索引
df.resample(rule='M' , on='time').apply(np.sum),其中on为时间对应的列名
14. 数据可视化
线形图
df.cumsum().polt()
柱状图/条形图
df.plot.bar(stacked = True),其中stacked表示是否堆叠
df.plot.barh()为条形图
饼图
df.plot.pie(subplots = True, figsize(10,10),autopct = '%0.2f%%'),其中subplots表示子视图,figsize表示尺寸,autopct显示百分比
散点图
df.plot.scatter(x='A', y='B'),根据A和B的关系绘制
一张散点图中绘制两组关系:先绘制AB的关系ax,然后df.plot.scatter(x='C',y='D',color = 'DarkBlue', label = 'Group2', alpha = 0.5, ax=ax),其中ax为向子视图ax中继续绘制,alpha为透明度
气泡图
df.plot.scatter(x='A', y='B', s = 30),其中s为气泡大小
面积图
df.plot.area(stacked = True)
箱式图
df.plot.box()
直方图
df.plot.hist()
1. 数据结构
Series
解释
一维数组 ,比NumPy多了索引。
一种一维数据结构,类似于Python的列表,但带有索引标签。
创建
创建方法一:pd.Series(data=[ ], index=list(' ')),其中index为行索引
创建方法二:pd.Series(data={'A':149,'B':150}),以键值对创建
DataFrame
解释
多个Series共用索引,类似Excel
不指定index就默认从0开始索引
创建
创建方法一:pd.DataFrame(data=np.random.randint(0,151,size=(10,3), index=list(' '), columns = [' ', ' ', ' ']),其中index为行索引,columns为列索引
创建方法二:pd.DataFrame(data={'A':[ ],'B':[ ]}),其中key作为列索引
2. 数据查看
查看DataFrame形状:df.shape
显示头部10行,默认5行:df.head(10)
显示末尾10行,默认5行:df.tail(10)
查看数据类型:df.dtypes
查看行索引:df.index
查看列索引:df.columns
返回NumPy数组:df.values
查看汇总统计,计数、平均值、标准差、最小最大值、四分位数:df.describe()
查看详细信息:df.info()
3. 数据输入与输出
CSV
df.to_csv('./data2.csv', sep=';', index = True, header = True),保存到当前路径下,文件名是data2.csv,sep为分隔符,index为是否保存行索引,header为是否保存列索引
pd.read_csv('./data2.csv', index_col=0, header= [0]),加载data2.csv文件,index_col=0指定第一列作为行索引,header=[0]指定第一行作为列索引,header=None即没有行索引
Excel
df.to_excel(' ',sheet_name=xxx),保存到指定路径,sheetname为工作表名
pd.read_excel(‘ ’, sheet_name=‘ ’, names = list('ABCD')),加载excel文件,sheetname读取某一个工作表,names替换行索引
保存多个工作表:
with pd.ExcelWriter('./data.xlsx') as writer:
df1.to_excel(writer,sheet_name='salary',index = False)
df2.to_excel(writer,sheet_name='score',index = False)
HDF5
HDF5可以管理非常大和复杂的数据集,有两个概念:group和dataset,group是目录,dataset是数据集
df.to_hdf(' ',key = ' '),保存数据key,作为标记
pd.read_hdf(' ', key = ' '),读取指定的key数据
SQL
from sqlalchemy import create_engine,数据库引擎
engine = create_engine('mysql+pymysql://root:12345678@localhost/pandas?charset=utf8'),其中root为用户名,12345678为密码,pandas为数据库
df.to_sql('xx',engine,if_exists='append'),xx为数据库表名,engine为上面命令,if_exists如果表名存在,追加数据
pd.read_sql('select * from score', engine, index_col=' '),加载engine数据,select为sql语句,index_col指定行索引名
4. 数据选取
数据获取
获取单列Series:df['Python']或者df.Python
获取多列:df[['Python', 'En']]
行切片:df[3:5]
标签选择:即行索引获取数据
获取指定行标签数据:df.loc[['A', 'C']]
获取A到C行的Python列数据:df.loc['A':'C', ['Python']]
行切片从E开始每隔2个获取一个,保留所有列:df.loc['E'::2, :]
位置选择:与标签选择类似,可以用数字
df.iloc[2:8, [0,2]]
boolean索引
cond = df.Python > 80, df[cond]
cond = df.index.isin(['a','b']), df[cond],判断index是否在数组[a,b]中
赋值操作
修改某个位置的值:df['A']['Python'] = 150或者df.loc['A','Python'] = 150或者df.iloc[3,2] = 150
新增一列:df['Java'] = 151
df[df>=128] = -df,按照where条件进行赋值,将大于128的变成原来的负数
处理薪资(如25k-35k):job['salary'] = job['salary'].str.lower().str.extract(r'(\d+)[k]-(\d+)k').applymap(lambda x:int(x)).mean(axis=1)
5. 数据集成
concat数据串联
行合并,行增加:pd.concat([df1,df2], axis = 0)
列合并,列增加:pd.concat([df1,df2], axis = 1)
数据插入
插入列:df.insert(loc = 1, column = ' ' , value = 1024),其中loc为位置,column为列名,value为插入的值
插入行:在最后一行 df1.append(df2),df1后面追加df2
如果想在指定位置插入行,先切割--添加--合并
Join SQL风格合并
根据共同的属性来合并数据
内合并:pd.merge(df1,df2,how = 'inner' , on = 'name')
外合并:pd.merge(df1,df2,how = 'outer', left_on = 'name', right_on = '名字'),其中left_on表示左边的DataFrame使用name进行合并,右边的DataFrame使用名字进行合并
左合并:pd.merge(df1,df2,how = 'left')
使用共同的行索引进行合并:pd.merge(df1,df2,left_index=True, right_index = True)
6. 数据清洗
重复数据过滤
判断是否存在重复数据:df.duplicated()
删除重复数据:df.drop_duplicates()
空数据过滤
判断是否存在空数据:df.isnull()
删除空数据:df.dropna(),若只想删除某列的空数据,可以df.dropna(subset=[' '])
填充空数据:df.fillna(value=1111)
删除指定的行或列
直接删除某列:del df['color']
删除指定列:df.drop(labels = ['color'] , axis = 1)
删除指定行:df.drop(labels = [0,1,5], axis = 0)
行索引重置
df.reset_index(inplace= True)
函数filter
只保留color列:df.filter(items = ['color'])
模糊匹配,保留带有i字母的索引df.filter(like = 'i')
正则表达式删选列标签:df.filter(regex='e$',axis = 1)
异常值过滤
cond = (df > 3*df.std()).any(axis=1) 3倍标准差为异常值
index = df[cond].index 不满足条件的行索引
df.drop(labels = index, axis=0) 根据行索引,删除数据
7. 数据转换
轴和元素转换
重命名轴索引:df.rename(index={'A':'AA', 'B':'BB'}, columns = {'Python':'人工智能'}),若加上inplace =True,则会直接修改原数据
替换值:df.replace(3, 100),将3替换为10.
df.replace({0:512,np.nan:998}),将0替换成512,将空值替换成998
df.replace({'Python':2}, 1024),将Python列为2的值,替换为1024
map映射Series转变
只能针对一列,没有对应的就返回空值
字典映射:df['Python'].map({1:1024, 2:'Hello'})
隐式函数映射:df['Python'].map(lambda x:True if x > 0 else False),如果大于0,返回True,否则返回False
显示函数映射:先定义一个convert函数,然后df['Python'].map(convert)
apply映射元素转变
既支持Series,也支持DataFrame
操作Series:df['Python'].apply(lambda x:1 if x else 0),如果True,则为1,否则为0
操作DataFrame:df.apply(lambda x:x+1000),对所有数据进行+1000
df.applymap(lambda x:x+1000)也可实现,不过applymap只支持DataFrame
一列执行不同计算:df['Python'].apply([np.sqrt, np.exp])
多列执行不同计算:df.apply({'Python': np.max , 'En': np.min})
支持显示函数映射
transform元素转变
与apply基本类似
重排随机抽样哑变量
随机重排10个数:np.random.permutation(10)
重排DataFrame:df.take(np.random.permutation(10))
随机抽样15个数据:df.take(np.random.randint(0,10,size = 15))
哑变量表示是否存在此数据,存在为1,不存在为0:pd.get_dummies(df, prefix=' ', prefix_sep=' ')
0 条评论
下一页