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