引入
import pandas as pd
《《------------------------------------------------------------------------------------------------------》》
使用
Pandas 数据结构:一维数据结构
创建字典格式 : pd.Series({“今日销售量” : 10086,“今日成交金额”:“1000084”},time=‘2018.8.21’)
创建数组格式 : pd.Series([10086,1000084],index=[\'今日销售量\',\'今日成交金额\'],time=\'2018.8.21\')
《《------------------------------------------------------------------------------------------------------》》
Dataframe :二维数据结构 是一个表格形的数据结构 ,“带标签的二维数组” ,带有(index) and (列标签)
使用
data = {\'name\':[\'Jake\',\'Jeek\',\'Anmi\'],\'age\':[22,15,32],\'time\':[\'2019.2.1\',\'2019.3.1\',\'2019.4.2\']}
pd.DataFrame(data) 形成一个表格数据
创建的三种方法 :其他方法都不通用
1.data = {\'name\':[\'a\',\'b\',\'c\'],\'age\':[22,15,32],\'time\':[\'2019.2.1\',\'2019.3.1\',\'2019.4.2\']}
2. 第二种 设置两个一维数组 Series的方式
data={\'one\':pd.Series(np.random.rand(2)),\'two\':pd.Series(np.random.rand(3))} 不设置index的
data={\'one\':pd.Series(np.random.rand(2)),\'two\':pd.Series(np.random.rand(3)),index=[\'a\',\'b\',\'c\']} 设置 index的
3. 第三种 通过二维数组,指定index 和 colums
arr=np.arange(9).reshape(3,3)
data = pd.DataFrame(arr)
data = pd.DataFrame(data,index=[\'a\',\'b\',\'c\'],colums=[\'昨天\',‘今天’,‘明天’])
print(data)
重新指定cloums列名: pd.DataFrame(data,colums=[\'H5\',\'Json\',\'Dic\'])
出现问题:
?如果指定后,列名比数据多,那么该列下面的数据 显示 NaN
?如果指定后,列名少于数据,只会显示对应的列数据
《《------------------------------------------------------------------------------------------------------》》
Pandas 索引+切片 中筛选数据
Series和Datafram索引的原理一样,我们以Dataframe的索引为主来学习
- 列索引:df[\'列名\'] (Series不存在列索引)
- 行索引:df.loc[]、df.iloc[]
选择列 / 选择行 / 切片 / 布尔判断
data[\'one\',\'abc\'] 通过columns 选
data.loc[\'a\',\'b\',\'c\',\'d\',\'e\'] 通过行 选 这个里面切片是包含最后一个的
data.iloc[:3] 通过切片 用数字表示,3之前的行 不包含3
data[data>50] 数据大于50的值
data[data[\'a\'] > 50] a列 》 50 行数据
?选择出来后 按照 顺序放入 序列
data[data > 5].index().tolist() 转为数组 按照顺序
《《------------------------------------------------------------------------------------------------------》》
Pandas 基本技巧
df.head() 默认前5条数据,也可以在括号内指定数字
df.tail() 默认后5条数据
df.T() 转置 index 互换 columns | 列变行,行变列
添加和修改 删除数据行
(添加操作)
这个二维数据表格 index 只有 5,那么就把 index[6] 赋值
(修改操作)
df[\'a\'] = 200 df[\'a\'][0] = 333
(删除操作)
del df[\'a\'] 删除 columns 【a】
df.drop(0) 删除行 删除index 行
两个数据对齐合并 相加
就会 默认 对应行和列 对齐相加填充,如果没有的行和列,填充NaN
DataFrame 数据排序
random4 = np.random.rand(3,3)*100
print(random4)
data4 = pd.DataFrame(random4,columns=[\'a\',\'b\',\'c\'])
data5 = data4.sort_values([\'b\'],ascending = True) #升序 False #降序
data5
DataFrame 索引排序
data7.sort_index() #升序
data7.sort_index(inplace=True) #数据更新改变
《《------------------------------------------------------------------------------------------------------》》
DataFrame 数据计算和统计基础
# np.nan :空值
# .mean()计算均值
m2 = df.mean(axis=1) 1=行数值计算结果 0 = 列结果
# axis参数:默认为0,以列来计算,axis=1,以行来计算,这里就按照行来汇总了
# 只统计数字列
m3 = df.mean(skipna=False)
# skipna参数:是否忽略NaN,默认True,如False,有NaN的列统计结果仍未NaN
# 可以通过索引单独统计一列
| # 主要数学计算方法,可用于Series和DataFrame(1) df = pd.DataFrame({\'key1\':np.arange(10), \'key2\':np.random.rand(10)*10}) print(df) print(\'-----\') print(df.count(),\'→ count统计非Na值的数量\n\') print(df.min(),\'→ min统计最小值\n\',df[\'key2\'].max(),\'→ max统计最大值\n\') print(df.quantile(q=0.75),\'→ quantile统计分位数,参数q确定位置\n\') print(df.sum(),\'→ sum求和\n\') print(df.mean(),\'→ mean求平均值\n\') print(df.median(),\'→ median求算数中位数,50%分位数\n\') print(df.std(),\'\n\',df.var(),\'→ std,var分别求标准差,方差\n\') print(df.skew(),\'→ skew样本的偏度\n\') print(df.kurt(),\'→ kurt样本的峰度\n\') |
# 主要数学计算方法,可用于Series和DataFrame(2)
df[\'key1\'].cumsum() 单列的累计和
df[\'key1\'].cumprod() 单列累计积
print(df.cummax(),\'\n\',df.cummin(),\'→ cummax,cummin分别求累计最大值,累计最小值\n\')
# 唯一值:.unique()
解决问题:colums 中有重复的值,两个一样的列,那么取到唯一 个 重新整理成为一个DataFrame表格
## 值计数:.value_counts()
解决问题: 得到该数据 出现的频率次数 a:2 b 3 生成一个新的 Series 括号内可写排序:sort = False or True
# 成员资格:.isin()
解决问题: 一个DataFrame 显示数据,我就想知道 里面有没有我指定的一个 50 有就是对应位置显示 True,没有就是False
《《------------------------------------------------------------------------------------------------------》》
pandas 文本数据处理
一般处理 :
|
1.自动排除为np的值 NaN 2.查看指定 文本数据字符的个数 .str.count() 3.修改大小写 .str.upper() .str.lower() 4.字符长度 .str.leng() 5.开始字符是哪一个 .str.startwith(\'\') 6.结束字符是哪一个 .str.endwith(\'\') print(s.str.lower(),\'→ lower小写\n\') df.columns.str.upper() 修改数据列 去空格 替换字符中的空格 str.replace(\' \',\'\',n=1) 把空格替换为 空字符 不写第三个参数 ,那么就是 全部替换 ,写了就是指定替换几个
# 字符串常用方法(4) - split、rsplit print(s.str.split(\',\').str[0]) # 可以使用get或[]符号访问拆分列表中的元素 # 可以使用expand可以轻松扩展此操作以返回DataFrame
# 字符串索引 print(s.str[0]) # 取第一个字符串 |
DataFrame 合并
.merge(data1,data2,on=\'key\') 根据key列为索引合并,看下两个是否共有 一样的key ,有就保留
@合并有有一个 分类 : 交集 和 并集 how=\'\' /inner、outer 、left、right
交集:解释就是 原有的数据合并没有对应上,那么就会不要,只保留 共有的
并集:解释就是 合并后不管你有没有,都会保留,只不过有的就是 保留原有数据,没有的 NaN
然后就是 设置参考键: on=‘’ 设置根据on里面的值,两两对比,如果一样就合并
on是一个键,how=\'left\' 根据两个表,用第一个表 how=\'right\' 根据两个表 ,用第二个表
指定参考键:我想用左边的lkey列作为左边的参考键, 我想用右边表的index 作为 参考键 (两个数据表合并比较)
(left_index right_index 左边(设置True就行) left_on right_on 这俩on(还是制定 index只不过分开指定,左表,右表说法) )
| 代码展示 |
dataG = pd.DataFrame({\'key\':list(\'abcdedf\'),\'list\':range(7)}); how =\'outer\' 根据list为合并的条件,用了outer 没有达到要求的NaN补全 print(pd.merge(df1, df2, left_on=\'key\', right_index=True)) 左边的指定键 为key,右边的表用 角标index 为键 合并比较 |
数据连接
两个DataFrame 连接,通过pd.concat([数组表1,数组表2]).sort_index() 角标顺序排列连接
两个DataFrame 连接,通过 pd.concat([数组表1,数组表2]),axis=1 列+列 成为一个DataFrame ,空的位置 用 NaN补全
inplace
两个Series pd.reset_index(inplace=True).drop = True
一个Series一维,重置了他的index值,0 1 2 3 4 5 6 然后吧替换之前的index 设置为一个列,drop 设置True 就是问你是否删除这个之前的;列
去重
按照 s.duplicate() 就会出现一个 True False 的列表 , 打印出 s[s.s.duplicate() == False] False 就代表不重复的值
replace
replace(\'a\',\'w\') replace([\'a\',\'b\'],50) 都可以进行一个替换
DataFrame 数据分组(简称列分组)
根据数据列columns名字,分组,并计算处理,得出数据 求和、平均值、长度、常用的一些列计算
简单解释语句:
df.groupby(\'A\') 通过A列,里面的数据 只要不一样就会成组, 分成一个组然后 计算
df.groupby([\'A\',\'B\']).mean() 通过A/B两列,里面的数据,只要A 和 B两个组成不同的配对,就可以成组,计算
df.groupby([\'A\'])[\'D\'].mean() # 以A分组,算D的平均值
分组后 类型格式为 groupby类型, 经过处理后 得出 可迭代对象,可以是数组、元祖、字典 一一对应操作方法
print(list(df.groupby(\'X\')), \'→ 可迭代对象,直接生成list\n\')
print(list(df.groupby(\'X\'))[0], \'→ 以元祖形式显示\n\')
for n,g in df.groupby(\'X\'):
print(n)
print(g)
print(\'###\') # n是组名,g是分组后的Dataframe
# .get_group()提取分组后的组
print(df.groupby([\'X\']).get_group(\'A\'),\'\n\')
# .groups:将分组后的groups转为dict
# 可以字典索引方法来查看groups里的元素
grouped = df.groupby([\'X\'])
print(grouped.groups)
print(grouped.groups[\'A\']) # 也可写:df.groupby(\'X\').groups[\'A\']
# .size():查看分组后的长度
grouped.size()
# 按照两个列进行分组
grouped = df.groupby([\'A\',\'B\']).groups
print(df)
print(grouped)
print(grouped[(\'foo\', \'three\')])
| # 分组计算函数方法 s = pd.Series([1, 2, 3, 10, 20, 30], index = [1, 2, 3, 1, 2, 3]) grouped = s.groupby(level=0) # 唯一索引用.groupby(level=0),将同一个index的分为一组 print(grouped) print(grouped.first(),\'→ first:非NaN的第一个值\n\') print(grouped.last(),\'→ last:非NaN的最后一个值\n\') print(grouped.sum(),\'→ sum:非NaN的和\n\') print(grouped.mean(),\'→ mean:非NaN的平均值\n\') print(grouped.median(),\'→ median:非NaN的算术中位数\n\') print(grouped.count(),\'→ count:非NaN的值\n\') print(grouped.min(),\'→ min、max:非NaN的最小值、最大值\n\') print(grouped.std(),\'→ std,var:非NaN的标准差和方差\n\') print(grouped.prod(),\'→ prod:非NaN的积\n\') |
DataFrame 读取分组
import os 引入 修改默认引入路径
os.chdir(\'c:/zzz/www\')
导入普通文本文件类型
| pd.read_table(\'data1.txt\',delimiter=\',\',sep=False) |
导入Excel数据表格 少量数据
| dataexcel = pd.read_excel(\'地市级党委书记数据库(2000-10).xlsx\',sheet_name=\'中国人民共和国地市级党委书记数据库(2000-10)\',header=0) print(dataexcel.head()) |
导入CSV大型数据表格
| datacsv = pd.read_csv(\'地市级党委书记数据库(2000-10).csv\',encoding = \'utf-8\') print(datacsv.head()) |