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 = {&apos;sex&apos;:&apos;catagory&apos;, &apos;class&apos;:&apos;catagory&apos;, &apos;Python&apos; = &apos;IT&apos;, &apos;Keras&apos; = &apos;IT&apos;}<br>for x, y in df.groupby(m, axis = 1):<br>print(x)<br>print(y)
分组聚合
分组直接调用函数进行聚合
df.groupby(by=&apos;sex&apos;).mean().round(1),根据sex分组,求平均值,保留一位小数
df.groupby(by=[&apos;sex&apos;, &apos;class&apos;]).size(),根据sex和class进行分组,统计每个班男女人数
分组聚合apply
聚合结果变少
df.groupby(by = [&apos;class&apos;, &apos;sex&apos;]).apply(np.mean)
分组聚合transform
聚合结果和原数据shape一样
df.groupby(by = [&apos;class&apos;, &apos;sex&apos;]).transform(np.mean)
分组聚合agg
apply和transform只能计算一种统计,agg可以多种统计
不同列进行相同计算
df.groupby(by = [&apos;class&apos;, &apos;sex&apos;]).agg([np.max,np.min,pd.Series.count])
不同列进行不同计算
df.groupby(by = [&apos;class&apos;,&apos;sex&apos;]).agg({&apos;Python&apos;:[(&apos;最大值&apos;, np.max), (&apos;最小值&apos;, np.min)], &apos;En&apos;:[(&apos;计数&apos;, pd.Series.count), (&apos;中位数&apos;, np.median)]})
透视表
类似于Excel透视表
df.pivot_table(values = [&apos;Python&apos;, &apos;En&apos;], index = [&apos;class&apos;, &apos;sex&apos;], aggfunc = {&apos;Python&apos;: [(&apos;最大值&apos;, np.max)], &apos;En&apos;:[(&apos;最小值&apos;, np.min), (&apos;中位数&apos;, np.median)]}) ,其中values表示要透视的值,index表示分组,aggfunc表示聚合运算
13. 时间序列
时间戳操作
创建方法
时刻数据
pd.Timestamp(&apos;2020-9-1 12&apos;),表示2020年9月1日12点
时期数据
pd.Period(&apos;2020-9-1&apos;, freq=&apos;M&apos;),表示一段时间,即2020年9月
批量时刻数据
pd.date_range(&apos;2020-9-1&apos;, freq = &apos;D&apos;, periods = 10),表示从2020年9月1日往后的10天时刻
批量时期数据
pd.period_range(&apos;2020-9-1&apos;, periods = 10, freq = &apos;M&apos;),表示2020年9月1日往后的10个月份
转换方法
pd.to_datetime(&apos;2020.09.01&apos;),将其他类型转换成日期类型2020-09-01
pd.to_datetime(1600171606, unit=&apos;s&apos;),将时间戳转变成世界标准时间
x + pd.DateOffset(days = 8),8天后时间
时间戳索引
时间戳索引
ts = pd.Series(np.random.randint(0,10,size=10), index=批量时刻数据)
str类型索引
ts[&apos;2020-09-01&apos;],获取2020年9月1日的数据<br>ts[&apos;2020-9&apos;],获取2020年9月份数据<br>ts[&apos;2020-9-15&apos;:&apos;2020-9-20&apos;],获取9月15到20日数据
时间戳索引
ts[pd.Timestamp(&apos;2020-9-1&apos;)],[]中为时间戳操作
时间戳索引属性
ts.index.year 获取年<br>ts.index.dayofweek 获取一周中的第几天<br>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(&apos;2W&apos;).sum(),以2周为单位进行汇总
ts.resample(&apos;3M&apos;).sum().cumsum(),以季度为单位进行汇总
DataFrame重采样
日期不是索引
df.resample(rule=&apos;M&apos; , on=&apos;time&apos;).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 = &apos;%0.2f%%&apos;),其中subplots表示子视图,figsize表示尺寸,autopct显示百分比
散点图
df.plot.scatter(x=&apos;A&apos;, y=&apos;B&apos;),根据A和B的关系绘制
一张散点图中绘制两组关系:先绘制AB的关系ax,然后df.plot.scatter(x=&apos;C&apos;,y=&apos;D&apos;,color = &apos;DarkBlue&apos;, label = &apos;Group2&apos;, alpha = 0.5, ax=ax),其中ax为向子视图ax中继续绘制,alpha为透明度
气泡图
df.plot.scatter(x=&apos;A&apos;, y=&apos;B&apos;, s = 30),其中s为气泡大小
面积图
df.plot.area(stacked = True)
箱式图
df.plot.box()
直方图
df.plot.hist()
1. 数据结构
Series
解释
一维数组 ,比NumPy多了索引。
一种一维数据结构,类似于Python的列表,但带有索引标签。
创建
创建方法一:pd.Series(data=[ ], index=list(&apos; &apos;)),其中index为行索引
创建方法二:pd.Series(data={&apos;A&apos;:149,&apos;B&apos;:150}),以键值对创建
DataFrame
解释
多个Series共用索引,类似Excel
不指定index就默认从0开始索引
创建
创建方法一:pd.DataFrame(data=np.random.randint(0,151,size=(10,3), index=list(&apos; &apos;), columns = [&apos; &apos;, &apos; &apos;, &apos; &apos;]),其中index为行索引,columns为列索引
创建方法二:pd.DataFrame(data={&apos;A&apos;:[ ],&apos;B&apos;:[ ]}),其中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(&apos;./data2.csv&apos;, sep=&apos;;&apos;, index = True, header = True),保存到当前路径下,文件名是data2.csv,sep为分隔符,index为是否保存行索引,header为是否保存列索引
pd.read_csv(&apos;./data2.csv&apos;, index_col=0, header= [0]),加载data2.csv文件,index_col=0指定第一列作为行索引,header=[0]指定第一行作为列索引,header=None即没有行索引
Excel
df.to_excel(&apos; &apos;,sheet_name=xxx),保存到指定路径,sheetname为工作表名
pd.read_excel(‘ ’, sheet_name=‘ ’, names = list(&apos;ABCD&apos;)),加载excel文件,sheetname读取某一个工作表,names替换行索引
保存多个工作表:
with pd.ExcelWriter(&apos;./data.xlsx&apos;) as writer:
df1.to_excel(writer,sheet_name=&apos;salary&apos;,index = False)
df2.to_excel(writer,sheet_name=&apos;score&apos;,index = False)
HDF5
HDF5可以管理非常大和复杂的数据集,有两个概念:group和dataset,group是目录,dataset是数据集
df.to_hdf(&apos; &apos;,key = &apos; &apos;),保存数据key,作为标记
pd.read_hdf(&apos; &apos;, key = &apos; &apos;),读取指定的key数据
SQL
from sqlalchemy import create_engine,数据库引擎
engine = create_engine(&apos;mysql+pymysql://root:12345678@localhost/pandas?charset=utf8&apos;),其中root为用户名,12345678为密码,pandas为数据库
df.to_sql(&apos;xx&apos;,engine,if_exists=&apos;append&apos;),xx为数据库表名,engine为上面命令,if_exists如果表名存在,追加数据
pd.read_sql(&apos;select * from score&apos;, engine, index_col=&apos; &apos;),加载engine数据,select为sql语句,index_col指定行索引名
4. 数据选取
数据获取
获取单列Series:df[&apos;Python&apos;]或者df.Python
获取多列:df[[&apos;Python&apos;, &apos;En&apos;]]
行切片:df[3:5]
标签选择:即行索引获取数据
获取指定行标签数据:df.loc[[&apos;A&apos;, &apos;C&apos;]]
获取A到C行的Python列数据:df.loc[&apos;A&apos;:&apos;C&apos;, [&apos;Python&apos;]]
行切片从E开始每隔2个获取一个,保留所有列:df.loc[&apos;E&apos;::2, :]
位置选择:与标签选择类似,可以用数字
df.iloc[2:8, [0,2]]
boolean索引
cond = df.Python &gt; 80, df[cond]
cond = df.index.isin([&apos;a&apos;,&apos;b&apos;]), df[cond],判断index是否在数组[a,b]中
赋值操作
修改某个位置的值:df[&apos;A&apos;][&apos;Python&apos;] = 150或者df.loc[&apos;A&apos;,&apos;Python&apos;] = 150或者df.iloc[3,2] = 150
新增一列:df[&apos;Java&apos;] = 151
df[df&gt;=128] = -df,按照where条件进行赋值,将大于128的变成原来的负数
处理薪资(如25k-35k):job[&apos;salary&apos;] = job[&apos;salary&apos;].str.lower().str.extract(r&apos;(\d+)[k]-(\d+)k&apos;).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 = &apos; &apos; , value = 1024),其中loc为位置,column为列名,value为插入的值
插入行:在最后一行 df1.append(df2),df1后面追加df2
如果想在指定位置插入行,先切割--添加--合并
Join SQL风格合并
根据共同的属性来合并数据
内合并:pd.merge(df1,df2,how = &apos;inner&apos; , on = &apos;name&apos;)
外合并:pd.merge(df1,df2,how = &apos;outer&apos;, left_on = &apos;name&apos;, right_on = &apos;名字&apos;),其中left_on表示左边的DataFrame使用name进行合并,右边的DataFrame使用名字进行合并
左合并:pd.merge(df1,df2,how = &apos;left&apos;)
使用共同的行索引进行合并:pd.merge(df1,df2,left_index=True, right_index = True)
6. 数据清洗
重复数据过滤
判断是否存在重复数据:df.duplicated()
删除重复数据:df.drop_duplicates()
空数据过滤
判断是否存在空数据:df.isnull()
删除空数据:df.dropna(),若只想删除某列的空数据,可以df.dropna(subset=[&apos; &apos;])
填充空数据:df.fillna(value=1111)
删除指定的行或列
直接删除某列:del df[&apos;color&apos;]
删除指定列:df.drop(labels = [&apos;color&apos;] , axis = 1)
删除指定行:df.drop(labels = [0,1,5], axis = 0)
行索引重置
df.reset_index(inplace= True)
函数filter
只保留color列:df.filter(items = [&apos;color&apos;])
模糊匹配,保留带有i字母的索引df.filter(like = &apos;i&apos;)
正则表达式删选列标签:df.filter(regex=&apos;e$&apos;,axis = 1)
异常值过滤
cond = (df &gt; 3*df.std()).any(axis=1) 3倍标准差为异常值
index = df[cond].index 不满足条件的行索引
df.drop(labels = index, axis=0) 根据行索引,删除数据
7. 数据转换
轴和元素转换
重命名轴索引:df.rename(index={&apos;A&apos;:&apos;AA&apos;, &apos;B&apos;:&apos;BB&apos;}, columns = {&apos;Python&apos;:&apos;人工智能&apos;}),若加上inplace =True,则会直接修改原数据
替换值:df.replace(3, 100),将3替换为10.
df.replace({0:512,np.nan:998}),将0替换成512,将空值替换成998
df.replace({&apos;Python&apos;:2}, 1024),将Python列为2的值,替换为1024
map映射Series转变
只能针对一列,没有对应的就返回空值
字典映射:df[&apos;Python&apos;].map({1:1024, 2:&apos;Hello&apos;})
隐式函数映射:df[&apos;Python&apos;].map(lambda x:True if x &gt; 0 else False),如果大于0,返回True,否则返回False
显示函数映射:先定义一个convert函数,然后df[&apos;Python&apos;].map(convert)
apply映射元素转变
既支持Series,也支持DataFrame
操作Series:df[&apos;Python&apos;].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[&apos;Python&apos;].apply([np.sqrt, np.exp])
多列执行不同计算:df.apply({&apos;Python&apos;: np.max , &apos;En&apos;: 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=&apos; &apos;, prefix_sep=&apos; &apos;)
0 条评论
下一页