Featured image of post Pandas

Pandas

Pandas-python 数据处理库

本文介绍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')
Licensed under CC BY-NC-SA 4.0
comments powered by Disqus
吸引力法则,大圣灵、外星人和心灵能量
使用 Hugo 构建
主题 StackJimmy 设计