目录不能折叠,想找什么,直接用‘搜索’找你想知道的点吧
关注公众号“木下学Python”可以找到我要 pandas 笔记的原文件哦
目录
# ### 指定导入哪个 Sheet (sheet_name)
# sheet_name 指定导入哪个 Sheet 文件,不指定默认第一个
# ### 当文件路径或文件名包含中文报错时 (engine)
# 如果文件格式时 CSV UTF-8(逗号分割)(*.csv),编码设置为 utf-8-sig
# 如果文件格式时 CSV(逗号分割)(*.csv),编码设置为 gbk
# 导入 .csv,即使是逗号分割的,也要用 sep 指明分割符号
# 如果只向删除全部是空白的行,传入一个参数 how='all' 即可
# # Series 一维类型
# ## 创建一个 Series
# ### 传入一个列表
# In[5]:
import pandas as pd
S1 = pd.Series(['a','b','c','d'])
print(S1)
# ### 指定索引传入
#
# In[10]:
S2 = pd.Series([1,2,3,4],index=['a','b','c','d'])
print(S2)
# ### 传入一个字典
# In[11]:
S3 = pd.Series({'a':1,'b':2,'c':3,'d':4})
print(S3)
# ## 利用 index 方法获取 Series 的索引
# In[12]:
print(S1.index)
print(S2.index)
print(S3.index)
# ## 利用 values 方法获取 Series 的值
# In[13]:
print(S1.values)
print(S2.values)
print(S3.values)
# # DataFrame 表格型数据结构
# ## 创建一个DataFrame
# ### 传入一个列表
# In[14]:
df1 = pd.DataFrame(['a','b','c','d'])
print(df1)
# ### 传入一个嵌套列表
# In[7]:
# 列表中的列表可以换成元组,里面有几个元素就代表有几列
df2 = pd.DataFrame([['a','A'],['b','B'],['c','C'],['d','D']])
print(df2)
# ### 指定行、索引列(index、columns)
# In[22]:
# 设置索引列
df31 = pd.DataFrame([['a','A'],['b','B'],['c','C'],['d','D']],columns=['小写','大写'])
print(df31)
# In[24]:
# 设置行索引
df32 = pd.DataFrame([['a','A'],['b','B'],['c','C'],['d','D']],index=['一','二','三','四'])
print(df32)
# In[9]:
# 行列索引同时设置
df33 = pd.DataFrame([['a','A'],['b','B'],['c','C'],['d','D']],index=['一','二','三','四'],columns=['小写','大写'])
print(df33)
# ### 传入一个字典
# In[11]:
# key 是列索引,还可设置行索引
data = {'小写':['a','b','c','d'],'大写':['A','B','C','D']}
df41 = pd.DataFrame(data,index=['一','二','三','四'])
print(df41)
# ### 获取 DataFrame 行。列索引
# In[10]:
# 获取列索引
print(df2.columns)
print(df33.columns)
# 获取行索引
print(df2.index)
print(df33.index)
# # 导入外部数据
# ## 导入 .xlsx 文件
# ### 基本导入
# In[15]:
# read_excel 导入
df = pd.read_excel(r'C:\Users\13479\Desktop\python项目\Excel数据\letter.xlsx')
print(df)
# ### 指定导入哪个 Sheet (sheet_name)
# In[17]:
# sheet_name 指定导入哪个 Sheet 文件,不指定默认第一个
df = pd.read_excel(r'C:\Users\13479\Desktop\python项目\Excel数据\letter.xlsx',sheet_name='Sheet2')
print(df)
# 还可以指定传入 Sheet 顺序,从 0 开始
df = pd.read_excel(r'C:\Users\13479\Desktop\python项目\Excel数据\letter.xlsx',sheet_name=0)
print(df)
# ### 指定行索引 (index_col)
# In[22]:
# 默认从 0 开始,index_col 来设置
df = pd.read_excel(r'C:\Users\13479\Desktop\python项目\Excel数据\letter.xlsx',sheet_name=0,index_col=1)
print(df)
# ### 指定列索引 (header)
# In[26]:
# 默认从 0 开始,header 来设置
# 第一行作为索引
df = pd.read_excel(r'C:\Users\13479\Desktop\python项目\Excel数据\letter.xlsx',sheet_name=0,header=0)
print(df)
# 第二行作为索引
df = pd.read_excel(r'C:\Users\13479\Desktop\python项目\Excel数据\letter.xlsx',sheet_name=0,header=1)
print(df)
# 默认从 0 开始的数作为列索引
df = pd.read_excel(r'C:\Users\13479\Desktop\python项目\Excel数据\letter.xlsx',sheet_name=0,header=None)
print(df)
# ### 指定导入列(usecols)
# In[54]:
# 指定从第 0 列 导入到第几列
df = pd.read_excel(r'C:\Users\13479\Desktop\python项目\Excel数据\letter.xlsx',usecols=0)
print(df)
df = pd.read_excel(r'C:\Users\13479\Desktop\python项目\Excel数据\letter.xlsx',usecols=1)
print(df)
# 以列表形式,指定导入哪些列
df = pd.read_excel(r'C:\Users\13479\Desktop\python项目\Excel数据\letter.xlsx',usecols=[3])
print(df)
# ## 导入 .csv 文件
# ### 直接导入
# In[56]:
df = pd.read_csv(r'C:\Users\13479\Desktop\python项目\Excel数据\手表.csv')
print(df)
# ### 指明分割符号 (sep)
# In[60]:
df = pd.read_csv(r'C:\Users\13479\Desktop\python项目\Excel数据\手表.csv',sep=',')
print(df)
# ### 指明读取行数(nrows)
# In[62]:
df = pd.read_csv(r'C:\Users\13479\Desktop\python项目\Excel数据\手表.csv',sep=',',nrows=2)
print(df)
# ### 指定编码格式 (encoding)
# In[64]:
df = pd.read_csv(r'C:\Users\13479\Desktop\python项目\Excel数据\手表.csv',encoding='utf-8')
print(df)
# ### 当文件路径或文件名包含中文报错时 (engine)
# In[65]:
# 如果文件格式时 CSV UTF-8(逗号分割)(*.csv),编码设置为 utf-8-sig
# 如果文件格式时 CSV(逗号分割)(*.csv),编码设置为 gbk
# ### 行列索引,导入某行某列
# In[66]:
# 与导入 .xlsx 文件一致
# # 导入 .txt 文件(read_table)
# In[73]:
# 可以导 .txt,还可以导 .csv
# 导入 .csv,即使是逗号分割的,也要用 sep 指明分割符号
# 其他参数与 read_csv() 的基本一样
df1 = pd.read_table(r'C:\Users\13479\Desktop\python项目\pygame\入门代码\read.txt',sep=' ',encoding='gbk')
print(df1)
df1 = pd.read_table(r'C:\Users\13479\Desktop\python项目\Excel数据\手表.csv',encoding='utf-8')
print(df1)
# # 导入 sql 文件
# In[85]:
import pymysql
# 创建连接
cli = pymysql.connect(host='localhost',user='user',password='passwd',db='db',charset='utf8')
# 导入
df = pd.read_sqsl(sql,cli)
# # 熟悉数据
# ## 利用 head 浏览前几行
# In[90]:
df = pd.read_csv(r'C:\Users\13479\Desktop\python项目\Excel数据\成绩分析.csv',encoding='gbk')
print(df.head()) # 默认显示前 5 行
print(df.head(2)) # 只展示前 2 行
# ## 利用 shape 获取数据表有几行几列
# In[92]:
df = pd.read_csv(r'C:\Users\13479\Desktop\python项目\Excel数据\成绩分析.csv',encoding='gbk')
print(df.shape)
# ## 利用 info 获取数据类型
# In[94]:
df = pd.read_csv(r'C:\Users\13479\Desktop\python项目\Excel数据\成绩分析.csv',encoding='gbk')
print(df.info())
# ## 利用 describe 获取数字分布情况
# In[4]:
# 调用是只计算数值类型
df = pd.read_csv(r'C:\Users\13479\Desktop\python项目\Excel数据\成绩分析.csv',encoding='gbk')
print(df.describe())
# # 数据预处理
# ## 缺失值查看(isnull())
# In[8]:
# NaN 表示缺失值
df = pd.read_excel(r'C:\Users\13479\Desktop\python项目\Excel数据\letter.xlsx')
print(df)
# 是缺失值返回 True
print(df.isnull())
# ## 删除缺失值(dropna())
# In[10]:
# 删除整行,只要有缺失值,就删除整行
# 如果只向删除全部是空白的行,传入一个参数 how='all' 即可
print(df.dropna())
# ## 缺失值填充(fillna())
# In[32]:
df = pd.read_excel(r'C:\Users\13479\Desktop\python项目\Excel数据\letter.xlsx')
print(df)
print(df.fillna(0))
# 也可以按不同列填充,指明列名即可
print(df.fillna({'英文':1}))
# 还可以指明多个列
print(df.fillna({'英文':1,123:2}))
# ## 重复值处理 (drop_duplicates())
# In[36]:
df = pd.read_excel(r'C:\Users\13479\Desktop\python项目\Excel数据\letter.xlsx')
print(df)
# 删除所有重复的行,只保留第一个
print(df.drop_duplicates())
# 以某一列为删除的字段,判断字段中的重复数据,重复就删掉,不管其他列一不一样
print(df.drop_duplicates(subset=123))
# 也可以按多列去重 subset 以列表即可
print(df.drop_duplicates(subset=[123,'英文']))
# 还可以指定保留第几个,第一个,去后一个,还是全部删,last 最后一个,first 第一个,False 全部删除
print(df.drop_duplicates(subset=[123,'英文'],keep='last'))
# ## 数据类型
# ### 查看类型(dtype)
# In[38]:
df = pd.read_excel(r'C:\Users\13479\Desktop\python项目\Excel数据\letter.xlsx')
print(df[123].dtype)
# ### 类型转换(astype())
# In[41]:
df = pd.read_excel(r'C:\Users\13479\Desktop\python项目\Excel数据\letter.xlsx')
print(df[123].dtype)
print(df[123].astype('float64'))
# ## 索引设置
# ### 为无索引表添加索引(columns)
# In[45]:
df = pd.read_excel(r'C:\Users\13479\Desktop\python项目\Excel数据\letter.xlsx')
df.columns=['z','j','k','l']
print(df)
# ### 重新设置索引(set_index())
# In[47]:
df = pd.read_excel(r'C:\Users\13479\Desktop\python项目\Excel数据\letter.xlsx')
print(df.set_index(123))
# ### 重置索引(reset_index())
# In[49]:
df = pd.read_excel(r'C:\Users\13479\Desktop\python项目\Excel数据\letter.xlsx')
df = df.set_index(123)
print(df)
# level 指定要将层次化索引的第几级别转化为 columns,爱一个索引为 0 级,第二个索引为 1 级,默认全部把索引转换为 columns
print(df.reset_index())
# drop 指定是否将原索引删掉,即不作为一个新的 colnmus,默认为 False,即不删除原索引
print(df.reset_index(level=0))
# inplace 用来指定是否修改元数据
# # 数据选择
# ## 列选择
# ### 选择某一列,某几列(iloc)
# In[73]:
df = pd.read_csv(r'C:\Users\13479\Desktop\python项目\Excel数据\成绩分析.csv',encoding='gbk')
# 选择一列,通过列名
print(df['姓名'].head())
# 选择多列,要用列表括起来,通过列名
print(df[['姓名','客观分']].head())
# 通过索引序号,逗号前面表示要显示几行,逗号后面表示要选择的列
print(df.iloc[:5,[0,3]])
# ### 选择连续的某几列
# In[75]:
print(df.iloc[:,0:3])
# ## 行选择
# ### 选择某一行,某几行(loc,iloc)
# In[96]:
df = pd.read_csv(r'C:\Users\13479\Desktop\python项目\Excel数据\成绩分析.csv',encoding='gbk')
print(df.head())
# 选择第一行
print(df.loc[0])
# 选择第一行和第二行
print(df.loc[[0,1]])
# 选择第一行
print(df.iloc[0])
# 选择第一行和第二行
print(df.iloc[[0,1]])
# ### 选择连续某几行
# In[98]:
# 选择第一道第三方
print(df.iloc[0:3])
# ### 选择满足条件的行
# In[104]:
df = pd.read_csv(r'C:\Users\13479\Desktop\python项目\Excel数据\成绩分析.csv',encoding='gbk')
print(df.head())
# 选择“客观分”这一列大于 30 的行
print(df[df['客观分']>30].head())
# 选择“客观分”这一列大于 30 的行,"主观分" 大于 70 的行
print(df[(df['客观分'] > 30) & (df['主观分'] > 70)].head())
# ## 行列同时选择
# ### 普通索引(loc)
# In[106]:
df = pd.read_csv(r'C:\Users\13479\Desktop\python项目\Excel数据\成绩分析.csv',encoding='gbk')
print(df.loc[[0,1],['姓名','客观分']])
# ### 位置索引(iloc)
# In[112]:
# 第一个列表选定指定行,第二个列表选定指定列
print(df.iloc[[0,2],[0,2]])
# ### 布尔索引 + 普通索引
# In[115]:
# 选定“客观分大于 30”,选定“姓名,客观分”这两列
print(df[df['客观分']>30][['姓名','客观分']].head())
# ### 切片索引 + 切片索引
# In[118]:
# 选定第一行到第二行,第二列到第三列
print(df.iloc[0:3,1:3].head())
# ### 切片索引 + 普通索引(ix)
# In[121]:
# 行(列)用切片,列(行)用普通
# 选择第一行到第三方,“客观分,主观分”这两列
print(df.ix[0:2,['主观分','客观分']].head())
# # 数值操作
# ## 数值替换
# ### 一对一替换(replace())
# In[128]:
import numpy as np
df = pd.read_csv(r'C:\Users\13479\Desktop\python项目\Excel数据\成绩分析.csv',encoding='gbk')
# “客观分”55 的替换成 60
print(df['客观分'].replace(55,60).head())
# 对缺失值进行替换,np.NaN 是表示缺失值的
print(df.replace(np.NaN,0))
# ### 多对一替换
# In[131]:
# 将 70,55 替换成 40
print(df.replace([70,55],40).head())
# ### 多对多替换
# In[133]:
# replace({'A','a','B','b'})
print(df.replace({40:1,50:1}).head())
# ## 数值排序(sort_values)
# ### 以某一列为准进行排序或升序(ascending)
# In[136]:
# 以“主观分”进行降序排列,默认升序,
print(df.sort_values(by=['主观分'],ascending=False).head())
# ### 按照有缺失值的列进行排序(na_position)
# In[ ]:
# 有 last,first 默认是排在最后
print(df.sort_values(by=['客观分'],na_position='last').head())
# ### 按多列数值排序
# In[146]:
# 但第一列出现重复的,按照第二列去排列
print(df.sort_values(by=['客观分','主观分'],ascending=[True,False]).head())
# ## 数值排名(rank())
# In[10]:
# 参数1:ascending 默认升序排列
# 参数2:method ,可取 average,first,min,max
# average:当待排名的数值有重复字时,返回重复值的平均排名
# first:按值在所有的待排列数据中出现的先后顺序排名
# min:待待排名数值有重复时,返回重复值的最佳排名
# max:取重复值对应的最大排名
df = pd.read_csv(r'C:\Users\13479\Desktop\python项目\Excel数据\成绩分析.csv',encoding='gbk')
print(df['客观分'].head(10))
# average
print(df['客观分'].rank(ascending=True,method='average').head(10))
# first
print(df['客观分'].rank(ascending=True,method='first').head(10))
# min
print(df['客观分'].rank(ascending=True,method='min').head(10))
# max
print(df['客观分'].rank(ascending=True,method='max').head(10))
# ## 数值删除(drop())
# ### 删除列
# In[33]:
# 需要参数 axis,并让其等于 1,
df = pd.read_csv(r'C:\Users\13479\Desktop\python项目\Excel数据\成绩分析.csv',encoding='gbk')
print(df.head())
print(df.drop(['客观分','主观分'],axis=1).head())
# 可以以列名传入就不需 axis 了,删除姓名列
print(df.drop(columns=['姓名']).head())
# 还可以在传入待删除列的位置,删除第一第二列
print(df.drop(df.columns[[0,1]],axis=1).head())
# ### 删除行
# In[39]:
# 需要参数 axis,并让其等于 0
df = pd.read_csv(r'C:\Users\13479\Desktop\python项目\Excel数据\成绩分析.csv',encoding='gbk')
print(df.head())
# 删除行索引名称为 0,1 的
print(df.drop([0,2],axis=0).head())
# 传入待删除的索引行号,删除第 0,3 行
print(df.drop(df.index[[0,3]],axis=0).head())
# 也可以将待删除行的行名传给 index,就不需要 axis 了
print(df.drop(index=[0,4]).head())
# ### 删除特定行
# In[42]:
# 加入要删除分数小于 30 的,是找出相反的,大于 30 的
print(df[df['客观分']>30].head())
# ## 数值计算(value_counts())
# In[16]:
df = pd.read_csv(r'C:\Users\13479\Desktop\python项目\Excel数据\成绩分析.csv',encoding='gbk')
# 第一列是要计算的数,第二列是出现次数
print(df['客观分'].value_counts().head())
# 还可以看每个值出现的占比,normalize
print(df['客观分'].value_counts(normalize=True).head())
# 可以按数值的降序排列,sort
print(df['客观分'].value_counts(normalize=True,sort=False).head())
# ## 获取唯一值(unique())
# In[21]:
# 获取“主观分”的唯一值
print(df['主观分'].unique())
# ## 数值查找(isin())
# In[24]:
# 选择这一列,看这一列中是否包含某个值,包含返回 True,否则返回 False
print(df.head())
print(df['客观分'].isin([70,55]).head())
# ## 区间切分(cut()、qcut())
# In[27]:
# bins 用来指明切分区间
# 把“客观分”分成 0 < x <=20 20 < x <=40 40 < x <= 60
print(pd.cut(df['客观分'],bins=[0,20,40,60]))
# qcut 不需要事先指明切分区间,只需要指明切分个数,即分成几份,原则每个组数据尽可能相等
# 将数据分成 3 份
print(pd.qcut(df['客观分'],3))
# ## 插入新的行和列(insert())
# In[29]:
# 插入行是两个表拼接
# 插入列用 insert() 括号中指明要插入的位置,插入后新的列名,以及要插入的数据
# 注意插入的值要跟表格的数据量一致
print(df.insert(3,'总分',[5,6,5,234,8]))
# 还可以直接以索引的方式进行插入
df['总分'] = [4,342,54,345,13]
# ## 行列互换(装置)(.T)
# In[32]:
print(df.head())
print(df.T.head())
# ## 表格重塑(stack、unstack)
# In[37]:
print(df.head())
# 表格转为树状
print(df.stack().head())
# 树状转表格
print(df.unstack().head())
# ## 长宽表转换
# ### 宽表转长表(stack(),melt())
# In[45]:
df = pd.read_csv(r'C:\Users\13479\Desktop\python项目\Excel数据\宽表.csv',encoding='gbk')
print(df)
# 宽转长,需要有公共列
# Stack() 实现
# 将不变的列设置成索引
print(df.set_index(['company','name']))
# 列索引转换为行索引
print(df.set_index(['company','name']).stack())
# 索引重置
print(df.set_index(['company','name']).stack().reset_index())
# melt() 实现
# id_vars:用于指明转换时不变的列
# var_name:列索引转换为行索引后的列名
# value_name:新索引对应的值列名
print(df.melt(id_vars=['name','company'],var_name='year',value_name='sale'))
# ### 长表转换为宽表(pivot_table)
# In[50]:
df = pd.read_csv(r'C:\Users\13479\Desktop\python项目\Excel数据\宽表.csv',encoding='gbk')
df = df.melt(id_vars=['name','company'],var_name='year',value_name='sale')
print(df)
# year 为索引列,values 为 值,不变的是 company,name
print(df.pivot_table(index=['company','name'],columns='year',values='sale'))
# ## apply()、applymap() 函数
# In[53]:
# 需要与匿名函数 lambda 结合使用,对一个序列中的所有元素执行相同的操作
df = pd.read_csv(r'C:\Users\13479\Desktop\python项目\Excel数据\成绩分析.csv',encoding='gbk')
print(df.head())
# apply()
# 将客观分每一个元素加一
print(df['客观分'].apply(lambda x:x + 1).head())
# applymap()
# 每一个元素执行相同的操作,但要是数字类型
print(df.applymap(lambda x:x + 1).head())
# # 数据运算
# ## 算术运算(加减乘除)
# In[12]:
# 必须是数字类型
import pandas as pd
df = pd.read_csv(r'C:\Users\13479\Desktop\python项目\Excel数据\23.csv',encoding='gbk')
print(df)
# 两列相加
print(df['c1'] + df['c2'])
# 两列相减
print(df['c1'] - df['c2'])
# 两列相乘
print(df['c1'] * df['c2'])
# 两列相处
print(df['c1'] / df['c2'])
# 任意一列加/减/乘/除一个常数值,这一列所有值都加/减这个常数值
print(df['c1'] - 2)
# ## 比较运算
# In[15]:
print(df['c1'] > df['c2'])
print(df['c1'] != df['c2'])
print(df['c1'] < df['c2'])
# ## 汇总运算
# ### count 非空值计数
# In[19]:
# 返回数据表中每列的非空值的个数
print(df)
print(df.count())
# axis 设置每一行的非空数值的个数
print(df.count(axis=1))
# 可以把每一列或每一行单独索引出来,单独查看这一列的非空值个数
print(df['c1'].count())
# ### sum 求和
# In[23]:
# 返回每一列的求和结果
print(df.sum())
# axis 指定等于 1,来求每一行的数值进行求和
print(df.sum(axis=1))
# 可指定某一列或某一行
print(df['c1'].sum())
# ### mean 求平均值
# In[28]:
print(df)
# 计算每一列的均值
print(df.mean())
# axis 参数计算每一行的均值
print(df.mean(axis=1))
# 单独求某一列或某一行的均值
print(df['c1'].mean())
# ### max 求最大值
# In[30]:
print(df)
# 求每一列最大值
print(df.max())
# 求每一行最大值,axis
print(df.max(axis=1))
# 求单独的一行或一列的最大值
print(df['c1'].max())
# ### min 求最小值
# In[32]:
# 与 max 一样
# ### median 求中位数
# In[33]:
# 从小到大排列,找出中间数
# 与 min 函数一样
# ### mode 求众数
# In[35]:
# 与 median 一样
# ### std 求标准差
# In[37]:
# 与 mode 一样
# ### var 求反差
# In[ ]:
# 与 std 一样
# ### quantile 求分位数
# In[41]:
# 主在这个区域内的范围,要有四分之一位数,四分之二位数,四分之三位数,而四分之二位数就是中位数
print(df)
# 对整个表求四分之一位数
print(df.quantile(0.25))
# 其他与 var 一样
# ## 相关性运算(corr())
# In[46]:
# 就是计算相关系数
print(df)
# 计算 c1 c2 相关的系数
print(df['c1'].corr(df['c2']))
# 计算所有字段两两之间的相关性
print(df.corr())
# # 时间序列
# ## 获取当前时刻的时间
# ### 返回当前时刻的日期和时间(now())
# In[5]:
from datetime import datetime
print(datetime.now())
# ### 返回当前时刻的年、月、日
# In[7]:
print(datetime.now().year)
print(datetime.now().month)
print(datetime.now().day)
# ### 返回当前时刻的周数(weekday()、isocalendar())
# In[ ]:
# python 是从 0 开始计数,所以加一
# 返回星期几
print(datetime.now().weekday() + 1)
# 返回这一年中的是是第几周
print(datetime.now().isocalendar())
print(datetime.now().isocalendar()[1])
# ## 指定日期和时间的格式(date()、strftime())
# In[15]:
# 只展示日期
print(datetime.now().date())
# 只展示时间
print(datetime.now().time())
# strftime() 自定义时间和日期的格式
# %H:小时【00,23】
# %I:小时【01,12】
# %M: 两位数的分【00,59】
# %S: 秒【00,61】(60 和 61 用于闰秒)
# %w: 用整数表示星期几,从 0 开始
# %U:每年的第几周,周日被认定为每周的第一天
# %W:每年的第几周,周一被认定为每周的第一天
# %F:%Y-%m-%d 的简写形式,如 2018-9-8
# %D:%m%d%y 的简写形式,如 04/5/2019
print(datetime.now().strftime('%Y-%m-%d'))
print(datetime.now().strftime('%Y-%m-%d %H:%M:%S'))
# ## 字符串和时间格式相互转换(str()、parse())
# ### 将时间格式转换为字符串格式
# In[17]:
now = datetime.now()
print(type(now))
print(type(str(now)))
# ### 将字符串格式转换为时间格式
# In[ ]:
# str_time = '2019-8-27'
print(type(str_time))
from dateutil.parser import parse
print(parse(str_time))
print(type(parse(str_time)))
# ## 时间索引(DatetimeIndex())
# In[ ]:
# 新建一个时间索引的 DataFrame
import pandas as pd
import numpy as np
index = pd.DatetimeIndex(['2019-01-01','2019-03-04','2019-04-05','2019-05-09'])
data = pd.DataFrame(np.arange(1,5),columns=['num'],index=index)
print(index)
# 获取 2019 数据
print(data['2019'])
# 获取 2019 1 月数据
print(data['2019-01'])
# 获取 2019 1 月到 5 月的数据
print(data['2019-01':'2019-03'])
# ## 时间运算
# ### 两个时间之差
# In[40]:
# 差返回的包含天数、秒、微秒三个等级
cha = datetime(2019,8,27,12,59) - datetime(2019,8,25,1,59)
# 差值为 11 小时,0 分,0 秒
print(cha)
# 返回天的时间差
print(cha.days)
# 返回秒的时间差
print(cha.seconds)
# 换算成小时的时间差
print(cha.seconds / 3600)
# ### 时间偏移(timedelta、date offset)
# In[54]:
# 给时间往前或往后推一段时间
# timedelta 只支持天、微秒、秒单位的时间运算
from datetime import timedelta
date = datetime(2019,8,27,20,30,30,30)
# 往后推一天
print(date + timedelta(days=1))
# 往后推 60 秒
print(date + timedelta(seconds=60))
# 往前推一天
print(date - timedelta(days=1))
# 往前推 60 秒
print(date - timedelta(days=1))
# date offset 天、小时、分钟的偏移
from pandas.tseries.offsets import Day,Hour,Minute
date = datetime(2019,8,27,20,30,30,30)
# 往后推一天
print(date + Day(1))
# 往后推 10 分钟
print(date + Minute(10))
# 往前推一天
print(date - Day(1))
# 往前推一小时
print(date - Hour(1))
# 往前推 10 分钟
print(date - Minute(10))
# # 数据分组/数据透视表
# ## 数据分组(groupby())
# ### 分组键是列名
# In[ ]:
# 分组后的数据进行汇总运算的操作称为聚合
import pandas as pd
df = pd.read_csv(r'C:\Users\13479\Desktop\python项目\Excel数据\df.csv',encoding='gbk')
print(df)
# 按照一列进行分组
print(df.groupby('分类'))
# 需要汇总计算后才会展现出来
print(df.groupby('分类').count())
# 按照多列进行分组
print(df.groupby(['分类','区域']).count())
# ### 分组键是 Series
# In[65]:
# 把某一列取出来,这一列就是一个 Series
# 按照一个 Series 进行分组
print(df.groupby(df['分类']).count())
# 按照多个 Series 进行分组
print(df.groupby([df['分类'],df['区域']]).count())
# 分组后对某些列进行汇总计算
print(df.groupby(df['分类'])['区域'].count())
# ### aggregate()
# In[ ]:
# 一次可以使用多种汇总方式
# 以“分类”为组,计数,汇总
print(df.groupby('分类').aggregate(['count','sum']))
# 让不同的列做不同的汇总
print(df.groupby('分类').aggregate({'分类':'count','区域':'sum'}))
# ### 对分组后的结果重置索引
# In[72]:
# 经过汇总运算后的形式不是标准的 DataFrame 形式
print(df.groupby('分类').sum())
print(df.groupby('分类').sum().reset_index())
# ## 数据透视表(pivot_table())
# In[87]:
# pd.pivot_table(data,values=None,index=None,colnmus=None,aggfunc='mean',fill_value=None,margins=False,dropna=True,margins_name='All')
# data 表示要做数据透视表的整个表(加上会报错)
# values 对应 excel 中值那个框
# index 对应 excel 中行那个框
# colnmus 对应 excel 中列那个框
# aggfunc 表示对 values 的计算类型
# fill_value 表示对空值的填充值
# margins 表示是否显示合计列
# droppna 表示是否删除缺失,如果为真时,则把一整行全作为缺失值删除
# margins_name 表示合计列的列名
# “分类”作为 index,“区域”作为 columns,‘7月’作为values,对 values 执行 count 运算
print(df.pivot_table(values='7月',columns='区域',index='分类',aggfunc='count',margins=True))
# 合计列的名称默认为 All,修改 margins_name
print(df.pivot_table(values='7月',columns='区域',index='分类',aggfunc='count',margins=True,margins_name='总计'))
# NaN 表示缺失值,fill_value 进行填充
print(df.pivot_table(values='7月',columns='区域',index='分类',aggfunc='count',margins=True,margins_name='总计',fill_value=0))
# aggfunc 传入一种类型,表示对所有值字段进行同样的计算量,对不同类型不同计算,需要传入字典
print(df.pivot_table(values=['7月','8月'],columns='区域',index='分类',aggfunc={'7月':'count','8月':'sum'}))
# 为了便于处理分析,一般都会对数据透视表的结果重置索引 reset_index()
# # 多表拼接
# ## 表的横向拼接(merge())
# ### 连接表的类型
# In[93]:
df1 = pd.read_csv(r'C:\Users\13479\Desktop\python项目\Excel数据\df1.csv',encoding='gbk')
df2 = pd.read_csv(r'C:\Users\13479\Desktop\python项目\Excel数据\df2.csv',encoding='gbk')
print(df1)
print(df2)
# 一对一,每行都有对应,公共列是一对一
print(pd.merge(df1,df2))
# 多对一,公共列有重复值
print(pd.merge(df1,df2,on='学号'))
# 多对多,公共列不是一对一,且两个表列都有重复值
print(pd.merge(df1,df2))
# ### 连接键的类型(on)
# In[96]:
# 没有 on 默认是以公共列,有 on 一般也指他们的公共列,指明多个公共列时,用列表括起来
df1 = pd.read_csv(r'C:\Users\13479\Desktop\python项目\Excel数据\df1.csv',encoding='gbk')
df2 = pd.read_csv(r'C:\Users\13479\Desktop\python项目\Excel数据\df2.csv',encoding='gbk')
# 分别指明左右连接键
# 实际值一样,但列名不同,就要指定左表和右表的键了
print(df1)
print(df2)
print(pd.merge(df1,df2,left_on='编号',right_on='学号'))
# 把索引列当做连接键
# left_index right_index
"""
print(pd.merge(df1,df2,left_index=True,right_index=True))
"""
# 索引列和普通列混用
"""
print(pd.merge(df1,df2,left_index=True,right_on='学号'))
"""
# ### 连接方式(how)
# In[102]:
# 右边公共列的值在左表对应的公共列找不到
df1 = pd.read_csv(r'C:\Users\13479\Desktop\python项目\Excel数据\df1.csv',encoding='gbk')
df2 = pd.read_csv(r'C:\Users\13479\Desktop\python项目\Excel数据\df2.csv',encoding='gbk')
print(df1)
print(df2)
# 内连接(inner)去两个表的公共部分
print(pd.merge(df1,df2,on='学号',how='inner'))
# 左连接(left)左表为基础,右表接过来,右表没有的就用 NaN,多余的就省略
print(pd.merge(df1,df2,on='学号',how='left'))
# 右连接跟左连接相反
print(pd.merge(df1,df2,on='学号',how='right'))
# 外连接(outer)取两个表的并集
print(pd.merge(df1,df2,on='学号',how='outer'))
# ### 重复列名处理(suffixes)
# In[103]:
# 但选好连接列后,其他列的列名有重复的,会自动添加后缀_x,_y,_z,suffixes 自定义
"""
print(pd.merge(df1,df2,on='学号',how='outer',suffixes=['_L','_R']))
"""
# ## 表的纵向拼接(concat())
# 一般场景分离的若干结构相同的数据表合并成一个数据表,跟横向拼接相对应
# ### 普通合并
# In[105]:
print(pd.concat([df1,df2]))
# ### 索引设置
# In[108]:
print(pd.concat([df1,df2],ignore_index=True))
# ### 重叠数据合并
# In[110]:
# 可能合并后有重复数据出现,就这样处理
print(pd.concat([df1,df2],ignore_index=True).drop_duplicates())
# # 结果导出
# ## 导出为 .xlsx 文件(to_excel())
# ### 设置文件导出路径(excel_writer)
# In[6]:
import pandas as pd
df1 = pd.read_csv(r'C:\Users\13479\Desktop\python项目\Excel数据\df1.csv',encoding='gbk')
df2 = pd.read_csv(r'C:\Users\13479\Desktop\python项目\Excel数据\df2.csv',encoding='gbk')
df3 = pd.merge(df1,df2,on='学号',how='inner')
print(df3)
print(df3.to_excel(excel_writer=r'C:\Users\13479\Desktop\python项目\Excel数据\df3.xlsx',encoding='gbk'))
# ### 设置 Sheet 名称(sheet_name)
# In[8]:
print(df3.to_excel(excel_writer=r'C:\Users\13479\Desktop\python项目\Excel数据\df3.xlsx',encoding='gbk',sheet_name='test'))
# ### 设置索引(index)
# In[10]:
# 保存的文件的索引默认是从 0 开始,导出是把这种索引去掉
print(df3.to_excel(excel_writer=r'C:\Users\13479\Desktop\python项目\Excel数据\df3.xlsx',encoding='gbk',sheet_name='test',index=False))
# ### 设置要导出的列(columns)
# In[12]:
print(df3.to_excel(excel_writer=r'C:\Users\13479\Desktop\python项目\Excel数据\df3.xlsx',encoding='gbk',sheet_name='test',columns=['名次','姓名']))
# ### 缺失值处理(na_rep)
# In[14]:
# 缺失值填充为 0
print(df3.to_excel(excel_writer=r'C:\Users\13479\Desktop\python项目\Excel数据\df3.xlsx',encoding='gbk',sheet_name='test',na_rep=0))
# ### 无穷值处理(inf_rep)
# In[19]:
# 一个浮点数除以 0,就会得到一个无穷值,把无穷值替换为 0
print(df3.to_excel(excel_writer=r'C:\Users\13479\Desktop\python项目\Excel数据\df3.xlsx',encoding='gbk',sheet_name='test',inf_rep=0))
# ## 导出 csv 文件(to_csv)
# ### 设置文件导出路径(path_or_buf)
# In[21]:
print(df3.to_csv(path_or_buf=r'C:\Users\13479\Desktop\python项目\Excel数据\df3.csv',encoding='gbk'))
# ### 设置索引
# ### 设置导出的列
# ### 缺失值处理
# 与 to_excel 方法一致
# ### 设置分割符号(sep)
# In[23]:
print(df3.to_csv(path_or_buf=r'C:\Users\13479\Desktop\python项目\Excel数据\df3.csv',encoding='gbk',sep=','))
# ## 将文件导出到多个 Sheet (ExcelWriter())
# In[26]:
# 可以将多个文件放在一个文件的不同 Sheet 中
# 声明一个读写对象
writer = pd.ExcelWriter(r'C:\Users\13479\Desktop\python项目\Excel数据\df3.xlsx',engine='xlsxwriter')
# 将 df1,df2 写入 excel 的 sheet1,sheet2 ,并命名为 表1,表2
df1 = pd.read_csv(r'C:\Users\13479\Desktop\python项目\Excel数据\df1.csv',encoding='gbk')
df2 = pd.read_csv(r'C:\Users\13479\Desktop\python项目\Excel数据\df2.csv',encoding='gbk')
print(df1.to_excel(writer,sheet_name='表1'))
print(df2.to_excel(writer,sheet_name='表2'))
# 保存读写内容
writer.save()