本文介绍pandas基础知识 提供代码示例
https://www.youtube.com/watch?v=zmdjNSmRXF4&list=PL-osiE80TeTsWmV9i9c58mdDCSskIFdDS&index=2
安装
1pip install pandas
建议学习过程中使用 [[jupyter]] 能可视化看到数据
教程使用数据: Stack Overflow Insights - Developer Hiring, Marketing, and User Research (2019)
1# 导入pandas
2import pandas as pd
3# 读取数据
4df=pd.read_csv('data/survey_results_public.csv')
excel
1# 读取excel(已知sheetname时)
2df = pd.read_excel('ance.xlsx', sheet_name = '')
3
4# 读取Excel文件
5excel_file = pd.ExcelFile('ance.xlsx')
6# 获取所有工作表名称
7sheet_names = excel_file.sheet_names
查看基本信息、预览表
1df # 查看数据(jupyter) (展示20行)
2df.head() # 查看数据(默认前5行)
3df.head(10) # 查看数据(前10行)
4df.tail() # 查看数据(默认后5行)
1pd.set_option('display.max_columns',85) # 设置最大列数85
2pd.set_option('display.max_rows',85) # 默认前5后5 设置最大行数85
1df.shape # 查看数据大小 (88883, 85) 88883行 85列
1df.info() # 查看数据信息 列名、非空数量、数据类型,object 一般是字符串
2df.columns # 查看列名 :Index(['first', 'last', 'email'], dtype='object')
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Respondent 88883 non-null int64
1 MainBranch 88331 non-null object
2 Hobbyist 88883 non-null object
数据结构
基本上,为了简单理解,可以把它当成字典 key 就是 lie头(headers)
1import pandas as pd
2person = {
3 "first" : ["fred","rose","rose"],
4 "last" : ["white","jojo","jojo"],
5 "email" : ["fred@gmail.com" , "rose@gmail.com","rose2@gmail.com"]
6}
7df = pd.DataFrame(person) # 通过字典创建数据结构
获取列
1df['email'] # 获取列
2df.email # 获取列 (不推荐,如果有如count类型的列名会执行相关函数)
0 fred@gmail.com
1 rose@gmail.com
Name: email, dtype: object
1df[['email','last']] # 获取多列(注意两个中括号)
注意反回的是series类型 pandas 专用的数据结构
1type(df['email']) # pandas.core.series.Series
获取行
iloc : interger location
1df.iloc[0] # 获取第一行
2df.iloc[[0,1]] # 获取第一行和第二行
3df.iloc[[0,1],2] # 获取第一行和第二行成一个表,在纵向获取第二列 (因为interger所以不能用名字)
loc : location , 在未建立索引的情况下,和iloc一样
1df.loc[[0,1],'email'] # 获取第一行和第二行成一个表,在纵向获取email列
2df.loc[[0,1],['email','last']] # 获取第一行和第二行成一个表,在纵向获取email和last列
loc- slicing
1df.loc[0:2,'MainBranch':'YearsCode'] # 获取第一行到第三行,MainBranch到YearsCode列(包括)
设置索引
默认索引是数字(不在任何的列里),可以设置为其他列
索引可以不唯一,比如设置人命为索引,loc的时候就会返回多行
1df.set_index('email') # 设置email为索引(返回设置的新表,不改变原表)
2df.set_index('email',inplace=True ) # 设置email为索引 (改变原表, email列消失)
3df.reset_index() # 重置索引
1df.loc['fred@gmail.com','last'] # 获取索引为fred@gmail的last(姓名)
filt
first last email
0 fred white fred@gmail.com
1 rose jojo rose@gmail.com
2 rose jojo rose2@gmail.com
1filt = df['first'] == 'rose' # 返回mask
2df[filt] # 返回表格
3df.loc[filt] # 返回表格
4df.loc[filt,'email'] # 返回表格中的email列(loc专有高级写法)
5
6df[df['first'] == 'rose'] # 组合写法(返回表格)(不推荐)
mask :
0 False
1 True
2 True
Name: first, dtype: bool
df[filt]
:
first last email
1 rose jojo rose@gmail.com
2 rose jojo rose2@gmail.com
and filt
and 使用 & , or 使用 |
1filt = (df['first'] == 'rose') & (df['last'] == 'jojo') # 返回mask
2df.loc[filt] # 返回表格
取反 filt
使用 ~
1filt = (df['first'] == 'rose') & (df['last'] == 'jojo') # 返回mask
2df.loc[~filt] # 返回表格(姓名不是 rose jojo 的行)
isin filt
1countries = ['United States','Canada','India']
2filt = df['Country'].isin(countries)
3df.loc[filt,'Country']
str filt
https://zhuanlan.zhihu.com/p/30894133
1filt = df['LanguageWorkedWith'].str.contains('Python',na=False) # 字符串包含Python, na=False 不包含空值
2df.loc[filt,'LanguageWorkedWith']
0 HTML/CSS;Java;JavaScript;Python
1 C++;HTML/CSS;Python
3 C;C++;C#;Python;SQL
非空字符串
1filt = df['测试URL'].str.len()>0
空内容判断
1df.loc[filt].empty
合并df
合并的前提:列名相同、列名数量相同
1concat_df = pd.concat([flited_df1,flited_df2])
2concat_df
建立空的dataframe 基底(循环concat可能用到)
1concat_df = pd.DataFrame() # 建立空的dataframe 基底
保存df
1 df.to_excel(excel_writer='xxx.xlsx', sheet_name='sheet1')