Pandas学习-DataFrame
Pandas学习-DataFrame
智汇君Pandas学习-DataFrame
1 | pandas是一个python的第三方库,是一个易于使用的数据结构和数据分析工具。在数据探索,数据转换,数据清洗中常用。 |
1 | 特点: |
DataFrame
1 | 它的每列数据可以是不同的数据类型,与Series的结构相似,DataFrame也是由索引和数据组成的,不同的是,DataFrame的索引不仅有行索引,还有列索引 |
创建
使用字典
1 | >>> d1=DataFrame({'c1':[1,2,3],'c2':[4,5,6],'c3':[7,8,9]}) |
1 | 创建时指定columns排序列(如果指定不存在的列会出现NaN),index指定行序(如果指定了column,index也得指定) |
使用列表
1 | data_list = [ |
使用numpy
1 | np_data = np.random.randint(1, 100, size=(4, 3)) |
使用Series
1 | s1 = pd.Series([1, 2, 3, 4], name='A') |
使用csv文件
1 | df5 = pd.read_csv('temp_data.csv') |
使用Excel文件
1 | df5 = pd.read_excel('temp_data.xlsx',sheet_name='xx',header=0,encoding='xx') |
空dataframe
1 | # 创建空DataFrame并逐步添加数据 |
日期索引
1 | print("7. 创建时间序列DataFrame:") |
1 | 时间序列DataFrame: |
取值
1 | series取值:通过[],iloc,loc |
1 | dataframe取值: |
单列
[c1]
1 | d[x] 取的是某一列,结果为series,index仍为dataframe的index |
.c1
1 | .x取值也可以 |
loc iloc
1 | employee.loc[:,'id'] #取id这一列 |
多列
[‘c1’,’c2’]
1 | 取多列,结果为dataframe |
loc iloc
1 | employee.loc[:,'id':'name'] # 取id到name这几列 |
行
iloc
1 | # 访问第一行: |
loc
1 | 这里只列举了行标签被设置为字符串的情况 |
取行列
loc
1 | data = [[1, 'Joe', 70000, 3], [2, 'Henry', 80000, 4], [3, 'Sam', 60000, ], [4, 'Max', 90000, None]] |
1 | employee.loc['a',['id','salary']] |
1 | employee.loc[:,['id','salary']] # 取id,salary这两列 |
iloc
1 | data = [[1, 'Joe', 70000, 3], [2, 'Henry', 80000, 4], [3, 'Sam', 60000, ], [4, 'Max', 90000, None]] |
1 | employee.iloc[[0,2],[0,2]] # 取两行两列 |
修改
插入列 insert和[]和concat
insert
1 | df = pd.DataFrame(data=[['lisa', 'f', 22], ['joy', 'f', 22], ['tom', 'm', 21]], columns=['name', 'sex', 'age']) |
[]
1 | 尾部插入 |
1 | # 添加新列: |
插入行 loc append concat
loc
1 | >>> df.loc[4] = ['zz','mason','m',24,'engineer’] |
append
1 | >>> df_insert = pd.DataFrame({'name':['mason','mario'],'sex':['m','f'],'age':[21,22]},index = [4,5]) |
concat
1 | # 创建一个 DataFrame |
某个位置插入行
1 | df = pd.DataFrame({"姓名": ["老许", "虎子"],"种类": ["猫", "狗"], "重量": ["10", "15"]}) |
修改数据类型
1 | df.astype({'user_id':'Int64', 'tweet_id':'Int64','tweet':'object','tweet_date':'object'}) |
1 | import pandas as pd |
标题
列标题
1 | >>> df.columns = ['name','gender','age'] #尽管我们只想把’sex’改为’gender’,但是仍然要把所有的列全写上,否则报错。 |
设置索引
.index
1 | >>> df.index = list('abc')#把index改为a,b,c.直接修改了df。 |
1 | df.index = [i for i in range(1,len(df)+1)] |
修改索引标签名
1 | #方法1: |
set_index( )
1 | 注意就算重新设置过索引,但是默认的0-n的隐式索引还是可以使用,也就是可以使用iloc进行访问,series可以[index] |
1 | DataFrame.set_index(keys, drop=True, append=False, inplace=False, verify_integrity=False) |
1 | import pandas as pd |
drop
1 | 下面我们尝试将Country这一列作为索引: |
1 | >>> df.set_index('Country',drop=False, append=False, inplace=False, verify_integrity=False) |
append
1 | 下面,我们再探索一下append参数的用法。(append的用法:是否将列附加到现有索引,默认为False。) |
1 | >>> df.set_index('Country',drop=False, append=False, inplace=False, verify_integrity=False) |
设置层级索引
.set_index()
1 | import pandas as pd |
index_col=[]
1 | df = pd.read_excel(r'C:\Users\XXXXXX\Desktop\pandas练习文档.xlsx',sheet_name=4,index_col=[0,1]) |
取值
1 | order |
1 | order.loc[11].loc[19] |
reset_index( )
1 | DataFrame.reset_index(level=None, drop=False, inplace=False, col_level=0, col_fill='') |
1 | level:数值类型可以为:int、str、tuple或list,默认无,仅从索引中删除给定级别。默认情况下移除所有级别。控制了具体要还原的那个等级的索引 。 |
在使用set_index()后的基础上
1 | df_new = df.set_index('Country',drop=True, append=False, inplace=False, verify_integrity=False) |
1 | >>> df_new.reset_index(drop=True) |
在原表没有set_index的基础上
1 | >>> df |
1 | 可以看到,此时数据表在原有的索引不变的基础上,添加了列名为index的新列,同时在新列上进行重置索引。 |
1 | >>> df.reset_index(drop=True) |
分组聚合
聚合函数
np.
1 | np.min(df[[列1,列2...]],axis=0) 按着每一行操作,作用到每一列 |
df.
1 | df[[列1,列2...]].max(axis=0) |
1 | .describe(include=['object']) |
1 | # 按部门分组统计: |
1 | salary age |
分组
单列分组
1 | import pandas as pd |
1 | grouped = vgsales.groupby('Year').mean() |
多列分组
1 | import pandas as pd |
1 | grouped = vgsales[['c1','c2'...,'Year','Genre']].groupby(['Year','Genre']) |
多个聚合函数
1 | import pandas as pd |
.agg()
.agg([xxx,xxx]) 对列使用相同的聚合函数
1 | 也可以是单个函数,不用[] |
1 | vgsales=pd.DataFrame(xxx) |
.agg({‘xx’:xx,’xx’:xx}) 为列指定不同的聚合函数
1 | grouped.agg({'NA_Sales':np.sum,'EU_Sales':np.mean}) #这种方式只会对指定列进行计算 |
1 | grouped.agg({'NA_Sales':[np.sum,np.median],'EU_Sales':[np.mean,np.sum]}) |
自定义函数
1 | def DoubleSum(data): |
.apply()
1 | var_names = [xx,xx...] |
自定义函数
1 | vgsales[var_names].apply(lambda x:x[2]-x[3],axis=1) # 计算每一行的第三列-第四列 |
.transform() 分组转换
1 | vgsales[var_name].transform(lambda x:x*2) |
与groupby搭配
1 | groupby还支持转换操作,可以将结果广播回原始DataFrame的形状: |
总结
1 | agg:方法灵活,能够对分组对象进行相同的聚合,还可以选择不同的聚合方法 |
数据透视表
1 | pivot_table = df.pivot_table( |
1 | # 部门-年龄组薪资透视表: |
缺失值处理
1 | # 创建包含缺失值的数据 |
1 | 包含缺失值的数据: |
.merge()
1 | 和关系型数据库的join操作一样,将两个表的数据记录连接 |
内连接
1 | 有用相同的列 |
1 | 用不同的列 |
外连接
1 | how='outer' left right 可以实现全外 左 右 外连接 inner默认 |
1 | # 创建另一个DataFrame |
1 | 合并后的数据: |
使用多个键连接
1 | >>> pd.merge(d1,d2,on=['c1','c2']) |
1 | pd.merge(df1,df2,left_on=['xx','xx'],right_on=['xx','xx']) |
left_index,right_index
1 | 很少用 |
sort参数
1 | 是否按照连接键排序 |
.concat()
series
1 | 类似于numpy的concatenate操作,进行串接 |
1 | >>> s1=Series(['a','b']) |
1 | >>> pd.concat([s1,s2,s3],axis=1) |
1 | 默认为outer操作 |
dataframe
1 | >>> df1=DataFrame(np.arange(6).reshape(3,2),index=['a','b','c'],columns=['one','two']) |
运算
1 | np.random.seed(42) # 设置随机种子以获得可重复的结果 |
mean
1 | 结果为series |
sum
1 | 两个dataframe相加,相同的列才可以 |
条件筛选
1 | data = { |
1 | # 薪资大于10000的员工: |
1 | # IT部门的员工: |
1 | # 多条件筛选(IT部门且薪资>10000): |
数据排序
sort_values
1 | na_position:last,first设置空缺值排在什么位置 |
按单列排序
1 | # 按薪资降序排列: |
按多列排序
1 | # 按部门和薪资排序: |
rank
dense
1 | import pandas as pd |
average(默认)
1 | import pandas as pd |
min
1 | 相同的值取较小的排名 |
1 | df['rank_min'] = df['score'].rank(method='min', ascending=False) |
max
1 | 相同的值取较大的排名 |
1 | df['rank_max'] = df['score'].rank(method='max', ascending=False) |
first
1 | 值相同按出现顺序排列,不允许并列。 |
1 | df['rank_first'] = df['score'].rank(method='first', ascending=False) |
应用于整个DataFrame
1 | 这个例子展示了如何对DataFrame中的每一列进行排名 |
1 | math physics chemistry |
分组内排名
1 | import pandas as pd |
1 | name subject score rank |
计算组内百分比排名
1 | import pandas as pd |
1 | name department sales percentile |
跨组的相对排名
1 | import pandas as pd |
计算滚动排名
1 | import pandas as pd |
计算累积排名
1 | import pandas as pd |
计算分组累积排名
1 | import pandas as pd |
计算排名的百分位数
1 | import pandas as pd |
计算分组内的Top N
1 | import pandas as pd |
计算分组内的百分比排名差异
1 | import pandas as pd |
计算移动窗口内的排名变化
1 | import pandas as pd |
计算分组内的排名密度
1 | import pandas as pd |
计算跨组的相对百分比排名
1 | import pandas as pd |
数据重塑
综合分析案例
1 | # 创建模拟销售数据 |
1 | 销售数据样本: |
基础统计分析
1 | # 1. 基础统计分析 |
1 | 1. 基础统计分析: |
按产品分析
1 | # 2. 按产品分析 |
1 | 按产品销售分析: |
按地区分析
1 | # 3. 按地区分析 |
1 | 按地区销售分析: |
时间序列分析
1 | # 4. 时间序列分析 |
1 | 4. 按月销售趋势分析: |
交叉分析
1 | # 5. 交叉分析 |
1 | 5. 产品-地区交叉分析: |
Top分析
1 | # 6. Top分析 |
1 | 6. Top分析: |
异常值检测
1 | # 7. 异常值检测 |
1 | 7. 异常值检测: |
相关性分析
1 | # 8. 相关性分析 |
1 | 8. 数值变量相关性分析: |
业务洞察
1 | # 9. 业务洞察 |
1 | 9. 业务洞察总结: |



















