pandas
相关笔记
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
入门Pandas不可不知的技巧 https://mp.weixin.qq.com/s/tOyVJJYuh7RInHbIeKOMnw 如果你用 Python 做数据分析,必然会绕不过 Pandas 的使用,实际上, Python 也是由于 numpy、pandas 等数据科学库的出现,才开始在数据科学领域实现了快速的发展,因此,学好 Pandas 有很重要的现实意义。 本文总结自己经常使用的pandas操作方法: 创建DataFrame数据 查看数据相关信息 查看头尾文件 花样取数 切片取数 常见函数使用 首先,导入包 import pandas as pd import numpy as np 01 创建DataFrame数据 方式1:通过字典直接创建 df1 = pd.DataFrame({ "name":["小明","小红","小孙","王小","关宇","刘蓓","张菲"], "age":[20,18,27,20,28,18,25], "sex":["男","女","男","男","男","女","女"], "score":[669,570,642,590,601,619,701], "address":["北京","深圳","广州","武汉","深圳","广州","长沙"] }) df1 数据如下图: 图片 方式2:通过本地数据读取 从本地文件中读取进来。现在本地有一个文件:学生信息.xlsx直接通过pd.read_excel()读进来: df2 = pd.read_excel("学生信息.xlsx") df2 图片 可以看到效果和上面是一样的 02 数据探索 查看数据shape shape表示数据是由多少行和列组成: df1.shape # (7,5) 查看字段属性名称 df1.columns 图片 查看属性的数据类型 df1.dtypes 图片 可以看到只有两种数据类型:int64和object 查看数据是否缺失 df1.isnull() # 如果缺失显示为True,否则显示False 图片 df1.isnull().sum() # 统计缺失值的个数。一个True计数一次 图片 结果显示:本次数据是没有缺失值的 查看数据行索引 df1.index 图片 查看数据描述信息 df1.describe 图片 查看数据统计值 统计值信息只会显示类型为数值型的数据统计值信息: df1.describe() 图片 统计值的结果包含:个数count、均值mean、方差std、最值minmax、四分位数25%、中位数50%、四分之三分位数75%。 03 查看头尾文件 通过head和tail方法能够快速查看数据的头尾文件。 head df1.head() # 默认是查看前5行数据 df1.head(3) # 指定显示的行数 tail df1.tail() # 默认尾部5行 df1.tail(3) # 指定尾部3行数据 04 花样取数 从pandas的DataFrame数据框中取出我们想要的数据,然后进行处理 1取出某个字段的数据 我们取出name这列的数据: name = df1["name"] name # 结果 0 小明 1 小红 2 小孙 3 王小 4 关宇 5 刘蓓 6 张菲 Name: name, dtype: object 2取出多个字段的数据 比如我们取出name和age列的数据: name_age = df1[["name","age"]] name_age # 结果 name age 0 小明 20 1 小红 18 2 小孙 27 3 王小 20 4 关宇 28 5 刘蓓 18 6 张菲 25 3根据字段类型选择数据 比如,我们想选择字段类型为int64的数据,通过查看的字段数据类型显示:age和score都是int64类型 1、选择单个数据类型 # 1、选择单个数据类型 df1.select_dtypes(include='int64') # 结果 age score 0 20 669 1 18 570 2 27 642 3 20 590 4 28 601 5 18 619 6 25 701 2、同时选择多个类型 df1.select_dtypes(include=['int64','object']) # 结果 name age sex score address 0 小明 20 男 669 北京 1 小红 18 女 570 深圳 2 小孙 27 男 642 广州 3 王小 20 男 590 武汉 4 关宇 28 男 601 深圳 5 刘蓓 18 女 619 广州 6 张菲 25 女 701 长沙 因为数据中只有int64,object,所以我们全部选出来了。 3、选择排除某些数据类型之外的数据: # 选择除了int64类型之外的数据 # 排除name和score字段之外的数据 df1.select_dtypes(exclude='int64') # 结果 name sex address 0 小明 男 北京 1 小红 女 深圳 2 小孙 男 广州 3 王小 男 武汉 4 关宇 男 深圳 5 刘蓓 女 广州 6 张菲 女 长沙 4 根据数值大小取数 1、直接通过判断大小来取数: df1[df1["age"] == 20] # 年龄等于20 df1[df1["age"] != 20] # 年龄不等于20 df1[df1["age"] >= 20] # 年龄大于等于20 2、多个判断条件连用 图片 第一次使用上面的方法报错:关键词是ambiguous。判断条件很让pandas混淆,改成下面的写法成功解决: df1[(df1["age"] >= 20) & (df1["age"] < 27)] 图片 5 根据字符串取数 1、通过单个条件取数 # 1、单条数据 df1[df1["name"] == "小明"] # 结果 name age sex score address 0 小明 20 男 669 北京 2、通过多个条件取数 选择姓名是小明,或者年龄大于25的数据 df1[(df1["name"] == "小明") | (df1["age"] > 25)] # 结果 name age sex score address 0 小明 20 男 669 北京 2 小孙 27 男 642 广州 4 关宇 28 男 601 深圳 3、字符串的开始、结尾、包含函数 str.startswith(string) str.endswith(string) str.contains(string) # 1、取出以“小”开头的姓名 df1[df1["name"].str.startswith("小")] # name以"小"开头 # 结果 name age sex score address 0 小明 20 男 669 北京 1 小红 18 女 570 深圳 2 小孙 27 男 642 广州 # 2、以“关”开始 df1[df1["name"].str.startswith("关")] # 结果 name age sex score address 4 关宇 28 男 601 深圳 # 3、以“菲”结尾 df1[df1["name"].str.endswith("菲")] # 结果 name age sex score address 6 张菲 25 女 701 长沙 # 4、取出包含“小”的数据:不管小是在开头,还是结尾都会被选出来 df1[df1["name"].str.contains("小")] # 结果 name age sex score address 0 小明 20 男 669 北京 1 小红 18 女 570 深圳 2 小孙 27 男 642 广州 3 王小 20 男 590 武汉 上面的王小不是小开头,但是包含小,所以也被选出来。 4、字符串取反操作 取反符号是波浪线:~ 下面的例子是:取出名字name中不包含小的数据,只有3个人名字中没有小字。 # 取出不包含小的数据 df1[~df1["name"].str.contains("小")] # 结果 name age sex score address 4 关宇 28 男 601 深圳 5 刘蓓 18 女 619 广州 6 张菲 25 女 701 长沙 5、切片取数 切片是Python中存在的概念,在pandas中同样可以使用。切片中存在3个概念:start、stop、step start:起始索引,包含 stop:结束索引,不包含 step:步长,可正可负; 写法为:[start:stop:step] 步长为正数 1、通过下面的3个案例说明:起始索引默认从0开始,步长默认是1 图片 图片 2、指定起始索引,不指定结束索引,表示一直取到数据末尾 df1[4:] # 从索引4开始取到末尾 # 结果 name age sex score address 4 关宇 28 男 601 深圳 5 刘蓓 18 女 619 广州 6 张菲 25 女 701 长沙 3、改变步长的值 df1[0:4:2] # 改变步长:每隔2个值取一行数据 # 结果 name age sex score address 0 小明 20 男 669 北京 2 小孙 27 男 642 广州 上面的例子不指定起始索引: df1[:4:2] # 默认从0开始 4、只指定步长 df1[::2] # 从头到尾,步长为2 # 结果 name age sex score address 0 小明 20 男 669 北京 2 小孙 27 男 642 广州 4 关宇 28 男 601 深圳 6 张菲 25 女 701 长沙 步长为负数 1、步长为-1,默认是倒序输出结果 df1[::-1] # 倒序输出 # 结果 name age sex score address 6 张菲 25 女 701 长沙 5 刘蓓 18 女 619 广州 4 关宇 28 男 601 深圳 3 王小 20 男 590 武汉 2 小孙 27 男 642 广州 1 小红 18 女 570 深圳 0 小明 20 男 669 北京 2、步长为负,指定起始和终止索引,起始索引大于终止索引 df1[4:0:-1] name age sex score address 4 关宇 28 男 601 深圳 3 王小 20 男 590 武汉 2 小孙 27 男 642 广州 1 小红 18 女 570 深圳 3、起始和终止索引为负数 df1[-1:-5:-1] # 最后一行记录索引为-1,不包含索引为-5的数据 name age sex score address 6 张菲 25 女 701 长沙 5 刘蓓 18 女 619 广州 4 关宇 28 男 601 深圳 3 王小 20 男 590 武汉 06 常用函数 -统计元素个数 很多时候我们需要统计某个列中每个元素出现的个数,相当于是做词频统计,使用:value_counts()方法,具体案例为: ⚠️:新数据中df1增加了一列:班级class,后续有作用 1 比如我们想统计每个城市出现了多少次: # 统计中每个城市各出现了多少次 address = df1["address"].value_counts() address 图片 结果自动是降序排列的Series类型数据 2索引重置 索引重置使用reset_index(): address_new = address.reset_index() address_new 图片 还比如我们想从数据中单独取出sex="男"的数据: fale = df1[df1["sex"] == "男"] fale 图片 我们观察到数据前面的索引还是原来的,但是我们希望的是从0开始显示,比较符合我们的习惯: fale_1 = fale.reset_index() fale_1 图片 出现的结果中索引是我们想要的结果,但是出现了一列新的数据,就是原来的索引构成的数据,这不是我们想要的数据,需要去除: fale_1 = fale.reset_index(drop=True) # 加上参数即可解决 fale_1 图片 3属性重命名 使用的是rename函数,传入columsn参数: address_new = address_new.rename(columns={"index":"address", "address":"number" }) address_new 图片 -groupby使用 groupby主要是实现分组统计的功能: 1、比如我们想统计男女各自的总分 图片 # 统计男女的总成绩:sum sex_score = df1.groupby("sex")["score"].sum() sex_score 图片 2、求男女各自的平均分mean # 统计男女的平均成绩:mean sex_score = df1.groupby("sex")["score"].mean() sex_score 图片 3、根据男女性别sex、班级class求总分 # 先根据性别、班级求总分 sex_class = df1.groupby(["sex","class"])["score"].sum() sex_class 图片 一行代码实现上面的功能: # 一行代码实现 df1.groupby(["sex","class"])["score"].sum().reset_index() 图片 - apply函数的使用 还是上面的df1数据集: 图片 1、需求1:我们想将性别中的男变成1,女变成0 # 1、改变:男-1,女-0 df2 = df1.copy() # 生成一个副本 df2["sex"] = df2["sex"].apply(lambda x: 1 if x=="男" else 0) # 通过匿名函数解决 df2 图片 我们还可以自定义一个函数来实现: # 自定义函数 def apply_sex(x): return 1 if x == "男" else 0 df3 = df1.copy() # 生成一个副本df3 df3["sex"] = df3["sex"].apply(apply_sex) # 通过自定义函数解决 df3 图片 2、还比如我们想给每个城市的后面加上一个“市”,变成北京市、深圳市等: # 2、给每个城市加上一个字:市,变成北京市、深圳市等 df4 = df1.copy() df4["address"] = df4["address"].apply(lambda x: x + "市") df4 图片 总结 本文中从pandas中DataFrame数据的创建,常见数据信息的探索,再到如何从数据框中获取到我们指定的数据,最后介绍了笔者常用的处理数据的方法,希望对入门或者对不熟悉pandas的朋友有所帮助。Pandas真的是十分强大,学好之后会大大节省我们处理数据的时间。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import pandas as pd import numpy as np result = pd.DataFrame() for name in os.listdir(): # 循环每个excel文件 df = pd.read_excel(name) df = df.sort_values('品牌搜索人数',ascending = False) # 降序 df['搜索人数排名'] = df['品牌搜索人数'].rank(ascending = False) # 添加字段并排名 df['搜索份额'] = df['品牌搜索人数'] / df['品牌搜索人数'].sum() brand = '凌云' brand_data = df.loc[df['品牌'].str.find(brand) != -1,:] #找到凌云品牌,取出行数据(loc取行,显示索引) other = df.loc[df['品牌'].str.find(brand) == -1,:] other_top5 = other.iloc[:5,:] data = pd.concat([brand_data,other_top5]) # 拼接 data['日期'] = name[4:-5] result = pd.concat([result,data])