8. 数据重塑
多层索引
pd.MultiIndex.from_product([list('ABCDEFG'),['期中', '期末'])
行旋转成列
df.unstack(level = -1),level指定哪一层,0表示第一层,-1表示最后一层,默认是-1
多层索引的计算
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表示聚合运算
14. 数据可视化
柱状图/条形图
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)
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})
支持显示函数映射
重排随机抽样哑变量
随机重排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;)