Pandas

本文介绍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')

Python Json Config
Wireguard-管线卫士