前面学习了 Python 第三方数据分析模块 Pandas 里一维数据 Series 的基础知识,本文我们学习 Pandas 里的 DataFrame 多维数据。
更多点击:Python学习日志目录
创建 DataFrame 数据
我们可以使用字典来创建 DataFrame 数据。
当然文档开头要导入 Pandas 数据,下面举例的时候,不再重复了:
import pandas as pd dict_data = { 'Name':['Anna','Nina','Elena','Tom'], 'Age':[12,11,3,8], 'Gender':['Girl','Girl','Girl','Boy']} data = pd.DataFrame(dict_data) print(data)
运行结果:
Name Age Gender 0 Anna 12 Girl 1 Nina 11 Girl 2 Elena 3 Girl 3 Tom 8 Boy
也就是'Name' 'Age' 'Gender'这些是行,后面的是列。
我们还可以自定义列的顺序:
data = pd.DataFrame(dict_data, columns=['Gender','Name','Age']) print(data)
运行结果:
Gender Name Age 0 Girl Anna 12 1 Girl Nina 11 2 Girl Elena 3 3 Boy Tom 8
获得 DataFrame 数据中列的名称
print(data.colums)
运行结果:
Index(['Gender', 'Name', 'Age'], dtype='object')
获取 DataFrame 数据中某一列的数据
下面两种方法都可以:
print(data['Name']) print(data.Age)
运行结果:
0 Anna 1 Nina 2 Elena 3 Tom Name: Name, dtype: object 0 12 1 11 2 3 3 8 Name: Age, dtype: int64
获取 DataFrame 数据中某一行的数据
根据行号索引:
print(data.iloc[0])
运行结果:
Gender Girl Name Anna Age 12 Name: 0, dtype: object
如果有特殊索引值的话,可以根据行索引值:
data.index = ['a','b','c','d'] print(data.loc['b'])
运行结果:
Gender Girl Name Nina Age 11 Name: b, dtype: object
切片跟 Series 非常像,同样对切片的数据进行修改的话,会修改原数据值:
slice_data = data['Age'] slice_data[0] = 9 print(data)
运行结果:
Gender Name Age a Girl Anna 9 b Girl Nina 11 c Girl Elena 3 d Boy Tom 8
所以如果想要切片数据作为一个独立的数据,不关联源数据,则在赋值的时候加一个.copy()函数即可:
slice_data = data['Age'].copy() slice_data[0] = 9 print(slice_data) print(data)
运行结果:
a 9 b 11 c 3 d 8 Name: Age, dtype: int64 Gender Name Age a Girl Anna 12 b Girl Nina 11 c Girl Elena 3 d Boy Tom 8
将 DataFrame 数据中的某一列修改为相同的数据:
data['Age'] = 8 print(data)
运行结果:
Gender Name Age a Girl Anna 8 b Girl Nina 8 c Girl Elena 8 d Boy Tom 8
也可以批量填充 DataFrame 某一列的数据:
data['Age'] = range(5,9) print(data)
运行结果:
Gender Name Age a Girl Anna 5 b Girl Nina 6 c Girl Elena 7 d Boy Tom 8
可以使用 Series 数据修改 DataFrame 数据中的某一列
age = pd.Series([8,7,6,9]) data['Age'] = age print(data)
运行结果:
Gender Name Age 0 Girl Anna 8 1 Girl Nina 7 2 Girl Elena 6 3 Boy Tom 9
如果 DataFrame 数据有特殊索引值,那么使用 Series 数据修改的时候,特殊索引值可以一一对应。
dict_data = { 'Name':['Anna','Nina','Elena','Tom'], 'Age':[12,11,3,8], 'Gender':['Girl','Girl','Girl','Boy']} data = pd.DataFrame(dict_data, index=['a','b','c','d']) age = pd.Series([18,17,15,9], index=['d','a','c','b']) data['Age'] = age print(age) print(data)
运行结果:
d 18 a 17 c 15 b 9 dtype: int64 Name Age Gender a Anna 17 Girl b Nina 9 Girl c Elena 15 Girl d Tom 18 Boy
删除 DataFrame 中的一列数据
del data['Gender'] print(data)
运行结果:
Name Age a Anna 12 b Nina 11 c Elena 3 d Tom 8
修改索引排序:
data = data.reindex(['c','b','d','a']) print(data)
运行结果:
Name Age Gender c Elena 3 Girl b Nina 11 Girl d Tom 8 Boy a Anna 12 Girl
如果修改索引的时候,索引数比原数据索引数多一行,则多的这行会被赋值 NaN
data = data.reindex(['c','b','d','a','x']) print(data)
运行结果:
Name Age Gender c Elena 3.0 Girl b Nina 11.0 Girl d Tom 8.0 Boy a Anna 12.0 Girl
如果修改索引的时候,想给增加的索引行赋值某个数,可以用给 fill_value 赋值的方法:
data = data.reindex(['c','b','d','a','x'], fill_value=0) print(data)
运行结果:
Name Age Gender c Elena 3 Girl b Nina 11 Girl d Tom 8 Boy a Anna 12 Girl x 0 0 0
还可以使用插值法给空行赋值
method = 'ffill' / method = 'pad' 是从最后一行赋值一组数据
# method = 'bfill' / method = 'backfill' 这个应该是从前面赋值一组数据,但是没有运行成功不知道为什么
data = pd.DataFrame(dict_data, index=['a','b','c','d']) print(data) data = data.reindex(['c','x','b','d','a'], method='ffill') print(data)
运行结果:
Name Age Gender a Anna 12 Girl b Nina 11 Girl c Elena 3 Girl d Tom 8 Boy Name Age Gender c Elena 3 Girl x Tom 8 Boy b Nina 11 Girl d Tom 8 Boy a Anna 12 Girl
扔掉包含缺失数据(为NaN)的行,即数据不全的行
print(data.dropna)
扔掉全部数据缺失的行
print(data.dropna(how='all'))
把数据缺失的行补充为指定数值
print(data.fillna(0))
运行结果:
Name Age Gender c Elena 9.0 Girl x 0 0.0 0 b Nina 11.0 Girl d Tom 8.0 Boy a Anna 12.0 Girl
也可以指定列填充不同的默认值
print(data.fillna({'Gender':'Girl','Age':8,'Name':'Unknow'}))
运行结果:
Name Age Gender c Elena 9.0 Girl x Unknow 8.0 Girl b Nina 11.0 Girl d Tom 8.0 Boy a Anna 12.0 Girl
删除某一行
data = data.drop('d')
筛选数据:
print(data[data['Age'] > 9]) print(data[data['Gender'] == 'Girl']) name_list = ['Nina','Anna','Elena'] print(data[data['Name'].isin(name_list)])
运行结果:
Name Age Gender b Nina 11.0 Girl a Anna 12.0 Girl Name Age Gender c Elena 9.0 Girl b Nina 11.0 Girl a Anna 12.0 Girl Name Age Gender c Elena 9.0 Girl b Nina 11.0 Girl a Anna 12.0 Girl
可以使用 groupby 对数据进行分组,之后可以使用.sum()/.mean()等函数进行计算
data = pd.DataFrame({ 'id':['a','c','b','c','a'], 'num':[1,2,3,4,5] }) group_data = data.groupby('id') sum_data = group_data.sum() print(sum_data)
运行结果:
num id a 6 b 3 c 6
数据按照索引名称进行排序
print(data.sort_index()) #升序 print(data.sort_index(ascending=False)) #倒序
运行结果:
Name Age Gender a Anna 12.0 Girl b Nina 11.0 Girl c Elena 9.0 Girl d Tom 8.0 Boy x NaN NaN NaN Name Age Gender x NaN NaN NaN d Tom 8.0 Boy c Elena 9.0 Girl b Nina 11.0 Girl a Anna 12.0 Girl
也可以按照某一列数据进行排序
print(data.sort_values(by='Age')) print(data.sort_values(by='Age',ascending=False))
运行结果:
Name Age Gender d Tom 8.0 Boy c Elena 9.0 Girl b Nina 11.0 Girl a Anna 12.0 Girl x NaN NaN NaN Name Age Gender a Anna 12.0 Girl b Nina 11.0 Girl c Elena 9.0 Girl d Tom 8.0 Boy x NaN NaN NaN
数据汇总:
数值则会相加,而字符串会连接在一起
print(data) print(data.sum())
运行结果:
Name Age Gender a Anna 12 Girl b Nina 11 Girl c Elena 9 Girl d Tom 8 Boy Name AnnaNinaElenaTom Age 40 Gender GirlGirlGirlBoy dtype: object
注意,如果数据中有 NaN,那么字符串连接就不会发生,数值列会相加
Name Age Gender c Elena 9.0 Girl x NaN NaN NaN b Nina 11.0 Girl d Tom 8.0 Boy a Anna 12.0 Girl --------------- Age 40.0 dtype: float64
数据统计相关函数:
函数 | 说明 |
---|---|
count | 统计非NaN数据的数量 |
min/max | 统计最小值和最大值 |
argmin/argmax | 查找最小值和最大值的位置 |
sum | 计算数据的和 |
mean | 计算平均数 |
median | 计算中位数 |
var | 计算方差 |
std | 计算标准差 |
可以使用多种方式对 DataFrame 进行索引
data = pd.DataFrame(dict_data, index=[['a','a','b','b'],[1,2,3,2]]) print(data)
运行结果:
Name Age Gender a 1 Anna 12 Girl 2 Nina 11 Girl b 3 Elena 9 Girl 2 Tom 8 Boy
会对其中特殊索引值进行合并。
对两个 DataFrame 数据进行连接:
dict_data = { 'Name':['Anna','Nina','Elena','Tom'], 'Age':[12,11,9,8], 'Gender':['Girl','Girl','Girl','Boy']} class_data = { 'Name':['Anna','Nina','Elena','Tom'], 'Class':[1,3,2,4] } data1 = pd.DataFrame(dict_data) data2 = pd.DataFrame(class_data) data = pd.merge(data1,data2) print(data)
运行结果:
Name Age Gender Class 0 Anna 12 Girl 1 1 Nina 11 Girl 3 2 Elena 9 Girl 2 3 Tom 8 Boy 4
在对两个 DataFrame 数据连接的时候,如果数据行数不同,则只会留下重合的部分
dict_data = { 'Name':['Anna','Nina','Elena','Tom'], 'Age':[12,11,9,8], 'Gender':['Girl','Girl','Girl','Boy']} class_data = { 'Name':['Anna','Nina','Elena','Elsa'], 'Class':[1,3,2,4] } data1 = pd.DataFrame(dict_data) data2 = pd.DataFrame(class_data) data = pd.merge(data1,data2) print(data)
运行结果:
Name Age Gender Class 0 Anna 12 Girl 1 1 Nina 11 Girl 3 2 Elena 9 Girl 2
如果想要两个 DataFrame 数据连接的时候,不丢弃掉非重合的部分,则需要添加一个参数 how:
data = pd.merge(data1,data2,how='outer')
输出结果:
Name Age Gender Class 0 Anna 12.0 Girl 1.0 1 Nina 11.0 Girl 3.0 2 Elena 9.0 Girl 2.0 3 Tom 8.0 Boy NaN 4 Elsa NaN NaN 4.0
也可以只保留一个数据的参数,那么 how 的值为 left 或者 right,以左边为准,还是以右边为准:
data = pd.merge(data1,data2,how='left')
输出结果:
Name Age Gender Class 0 Anna 12 Girl 1.0 1 Nina 11 Girl 3.0 2 Elena 9 Girl 2.0 3 Tom 8 Boy NaN
两个 DataFrame 数据连接的时候,想要以某一列的数据对齐进行连接,增加一个on参数就可以:
data = pd.merge(data1,data2,on='Name')
如果两个 DataFrame 数据中没有同名称的列,连接的时候,可以分别指定左右两个数据的某一列进行对齐
data = pd.merge(data1,data2,left_on='Name',right_on='Student')
Pandas 读写文件
读取 CSV 文件:
data = pd.read_csv('simple.csv')
读取的时候,会默认把第一行当做标题行。
如果读取的时候,源文件里没有标题行,则需要添加参数 header=None
data = pd.read_csv('simple.csv',header=None)
这时候,标题行则为0,1,2,3等数值。
也可以使用names参数自定义标题行:
data = pd.read_csv('simple.csv',names=['Name','Age','Class'])
如果想把第一列当做索引列,则需要增加参数index_col,指定某一列为索引列
data = pd.read_csv('simple.csv',names=['ID','Name','Age','Class'],index_col='ID')
另外读取的时候,可以使用sep参数指定源文件的分隔符:
data = pd.read_csv('simple.csv',sep=',')
存储为 CSV 文件:
data.to_csv('simple.csv')
把 data 的数据存入csv文件。
读取 Excel 文件:
需要安装一个第三方模块 xlrd
pip install xlrd -i https://pypi.douban.com/simple
读取 Excel 文件
file = pd.ExcelFile('simple.xlsx') data = file.parse('Sheet1')
其中 Sheet1 为 Excel 中想要读取的工作表的名称。
Pandas VS Numpy
读取文件的时候,Pandas 速度远远快于 Numpy,而且功能更强大。但是在数据运算方面 Numpy 更快一些。
下一篇:Python 详细安装步骤图解
上一篇:Python 数据分析模块 Pandas 之 Series 数据
- 相关文章 -
Python 基础知识入门演示 - 2017-12-31
Python 数字与数字型运算 - 2020-09-08
Python 基础知识之数据类型 - 2020-09-07
Python 学习中非常好用的编辑器 Sublime Text 3 - 2020-09-07
Python 基础知识之变量 - 2020-09-03
Python 详细安装步骤图解 - 2020-09-01
Python 数据分析模块 Pandas 之 DataFrame 数据 - 2020-02-09
Python 数据分析模块 Pandas 之 Series 数据 - 2020-02-05
- 文章评论 -
- 最新评论[0条评论] -
版权所有©逍遥峡谷 - 星际中心超自然局 · 地球总部 |
逍遥峡谷 ·
酷品优选
Copyright©Interstellar Central Occult Agency (I.C.O.A)
本局纯属虚构,如有雷同,纯属巧合