之前发的pandas零零散散有些乱,汇总一下
数据预览和预处理
在拿到数据第一步当然是对数据做一个大概的浏览,以及对缺失值重复值进行相关处理。
读取数据---- df = pd.read_excel('xxxx')
1.查看数据维度 ------df.shape
2.随机查看5条数据------df.sample(5)
3.查看数据前后5行----- 前5行:df.head() 后5行:df.tail()
4.查看数据信息,看数据类型,有无缺失值-----df.info()
5.查看 **数值型** 列的统计信息,计数、均值什么的----df.describe()
6.计算总的缺失值-----df.isna().sum().sum() 第一个sum()是对各列缺失值,第二个是总计
7.计算各列缺失值-----df.isnull().sum() isnull和isna是一样的
8.查看缺失值所在行----df [df.isnull.values==True]
9.将缺失值出现的行全部删掉 ---df.dropna()
10.补充缺失值----df.fillna()
11.将全部重复值所在的行筛选出来---df [ df.duplicated() ]
12.删除全部的重复值---- df.drop_duplicates()
删除全部的重复值,但保留最后一次出现的值 df.drop_duplicates(keep='last')
统计性描述与统计学分析
查看数据
1.修改索引,将学校列作为索引(set_index)
df.set_index("学校名称",inplace= True)
2.数据排序,按总分升序排序并展示前20名(sort_values)
df.sort_values(by='总分', ascending=True).head(20)
3.介绍一个nlargest()函数,用于返回DataFrame中最大的n个值所在的行。
三个参数
这里我们将数据按照 高端人才得分 降序排序,展示前 10 位
df.nlargest(10, '高端人才得分')
4.统计均值----- df.mean()
5.统计中位数-----df.median()
6.统计众数-----df.mode()
7.统计多种指标用聚合函数agg()
计算 总分、高端人才得分、办学层次得分的最大最小值、中位数、均值
数据筛选和修改
加载数据
1.将原来df列名 unnamed:2,unnamed:3,unnamed:4修改为 金牌数
、银牌数
、铜牌数
rename()函数
df.rename(columns={'Unnamed: 2':'金牌数',
'Unnamed: 3':'银牌数',
'Unnamed: 4':'铜牌数'},inplace=True)
2.设置索引(set_index())
3.修改索引名(rename_axis())
4.数值替换 replace()
将金牌数列的数字 `0` 替换为 `无`
df['金牌数'].replace(0,'无',inplace=True)
5.查看各列数据类型 df.dtypes()
6.修改类型 astype()
df['金牌数'] = df['金牌数'].fillna('0').astype(int)
7.一次性添加多列数据 df.assign()
df = df.assign(金铜牌总数=df.金牌数 + df.铜牌数,
银铜牌总数=df.银牌数+df.铜牌数)
8.删除行 df.drop() 可以在里面写筛选条件比如
df.drop(df[df.金牌数<20].index)
9.删除列 df.drop(columns=xx,inplace=True)
10.筛选列
通过列号提取第 1、2、3、4 列
df.iloc[:,[0,1,2,3]] 第一个冒号表示筛选所有行
通过列名筛选列
df [ ['金牌数','银牌数','铜牌数'] ]
11.筛选行
提取第 10 行之后的全部行 df.loc[9:]
提取 金牌数 大于 30 的行
df[df['金牌数'] > 30]
提取 中国、美国、英国、日本、巴西 五行数据
df.loc[df['国家奥委会'].isin(['中国','美国','英国','日本','巴西'])]
使用 query 提取 金牌数 + 银牌数 大于 15 的国家
df.query('金牌数+银牌数 > 15')
数据分组与聚合
导入数据
1.分组统计均值
计算各区(district
)的薪资(salary
)均值
df[['district','salary']].groupby(by='district',as_index=False).mean()
as_index 参数意思为是否将分组条件作为索引,默认为True
2.分组统计排序
计算并提取平均薪资最高的区
df[['district','salary']].groupby(by='district').mean().sort_values('salary',ascending=False).head(1)
3.分组统计频率
计算不同行政区(district
),不同规模公司(companySize
)出现的次数
df.groupby("district")['companySize'].value_counts()
修改索引
- district -> 行政区
- companySize -> 公司规模
pd.DataFrame(df.groupby("district")['companySize'].value_counts()).rename_axis(["行政区", "公司规模"])
4.分组统计计数
统计每个区出现的公司数量
df.groupby('district')['companySize'].count()
5.分组查看全部
将数据按照 district
、salary
进行分组,并查看各分组内容
6.分组查看指定组
将数据按照 district
、salary
进行分组,并查看西湖区薪资为 30000 的工作
7.以匿名函数得出的值分组
pd.DataFrame(df.groupby([df.createTime.apply(lambda x:x.day)])['district'].value_counts()).rename_axis(['发布日','行政区'])
8.分组转换transform
在原数据框 df 新增一列,数值为该区的平均薪资水平
df['该区平均工资'] = df[['district','salary']].groupby(by='district').transform('mean')
transform函数 指定新增列的转换类型。
9.分组过滤filter
提取平均工资小于 30000 的行政区的全部数据
df.groupby('district').filter(lambda x:x['salary'].mean()<30000)
先暂时汇总到这里,后面再汇总数据透视表等内容。
唉,今天又是当fw的一天。。。。。。。