1.DataFrame常用属性、函数以及索引方式
1.1DataFrame简介
DataFrame是一个表格型的数据结构,它含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔值等)。DataFrame既有行索引也有列索引,它可以被看做由Series组成的字典(共用同一个索引)。DataFrame可以通过类似字典的方式或者.columnname的方式将列获取为一个Series。行也可以通过位置或名称的方式进行获取。
为不存在的列赋值会创建新列。
>>> del frame['xxx'] # 删除列
1.2DataFrame常用属性
属性 | 说明 |
values | DataFrame的值 |
index | 行索引 |
index.name | 行索引的名字 |
columns | 列索引 |
columns.name | 列索引的名字 |
ix | 返回行的DataFrame |
ix[[x,y,...], [x,y,...]] | 对行重新索引,然后对列重新索引 |
T | frame行列转置 |
1.3DataFrame常用函数
1.3.1函数 | 说明 |
DataFrame(dict, columns=dict.index, index=[dict.columnnum]) DataFrame(二维ndarray) DataFrame(由数组、列表或元组组成的字典) DataFrame(NumPy的结构化/记录数组) DataFrame(由Series组成的字典) DataFrame(由字典组成的字典) DataFrame(字典或Series的列表) DataFrame(由列表或元组组成的列表) DataFrame(DataFrame) DataFrame(NumPy的MaskedArray) | 构建DataFrame 数据矩阵,还可以传入行标和列标 每个序列会变成DataFrame的一列。所有序列的长度必须相同 类似于“由数组组成的字典” 每个Series会成为一列。如果没有显式制定索引,则各Series的索引会被合并成结果的行索引 各内层字典会成为一列。键会被合并成结果的行索引。 各项将会成为DataFrame的一行。索引的并集会成为DataFrame的列标。 类似于二维ndarray 沿用DataFrame 类似于二维ndarray,但掩码结果会变成NA/缺失值
|
df.reindex([x,y,...], fill_value=NaN, limit) df.reindex([x,y,...], method=NaN) df.reindex([x,y,...], columns=[x,y,...],copy=True) | 返回一个适应新索引的新对象,将缺失值填充为fill_value,最大填充量为limit 返回适应新索引的新对象,填充方式为method 同时对行和列进行重新索引,默认复制新对象。 |
df.drop(index, axis=0) | 丢弃指定轴上的指定项。 |
1.3.2排序函数 | 说明 |
df.sort_index(axis=0, ascending=True) df.sort_index(by=[a,b,...]) | 根据索引排序 |
1.3.3汇总统计函数 | 说明 |
df.count() | 非NaN的数量 |
df.describe() | 一次性产生多个汇总统计 |
df.min() df.min() | 最小值 最大值 |
df.idxmax(axis=0, skipna=True) df.idxmin(axis=0, skipna=True) | 返回含有最大值的index的Series 返回含有最小值的index的Series |
df.quantile(axis=0) | 计算样本的分位数 |
df.sum(axis=0, skipna=True, level=NaN) df.mean(axis=0, skipna=True, level=NaN) df.median(axis=0, skipna=True, level=NaN) df.mad(axis=0, skipna=True, level=NaN) df.var(axis=0, skipna=True, level=NaN) df.std(axis=0, skipna=True, level=NaN) df.skew(axis=0, skipna=True, level=NaN) df.kurt(axis=0, skipna=True, level=NaN) df.cumsum(axis=0, skipna=True, level=NaN) df.cummin(axis=0, skipna=True, level=NaN) df.cummax(axis=0, skipna=True, level=NaN) df.cumprod(axis=0, skipna=True, level=NaN) df.diff(axis=0) df.pct_change(axis=0) | 返回一个含有求和小计的Series 返回一个含有平均值的Series 返回一个含有算术中位数的Series 返回一个根据平均值计算平均绝对离差的Series 返回一个方差的Series 返回一个标准差的Series 返回样本值的偏度(三阶距) 返回样本值的峰度(四阶距) 返回样本的累计和 返回样本的累计最大值 返回样本的累计最小值 返回样本的累计积 返回样本的一阶差分 返回样本的百分比数变化 |
1.3.4计算函数 | 说明 |
df.add(df2, fill_value=NaN, axist=1) df.sub(df2, fill_value=NaN, axist=1) df.div(df2, fill_value=NaN, axist=1) df.mul(df2, fill_value=NaN, axist=1) | 元素级相加,对齐时找不到元素默认用fill_value 元素级相减,对齐时找不到元素默认用fill_value 元素级相除,对齐时找不到元素默认用fill_value 元素级相乘,对齐时找不到元素默认用fill_value |
df.apply(f, axis=0) | 将f函数应用到由各行各列所形成的一维数组上 |
df.applymap(f) | 将f函数应用到各个元素上 |
df.cumsum(axis=0, skipna=True) | 累加,返回累加后的dataframe |
1.4DataFrame索引方式
索引方式 | 说明 |
df[val] | 选取DataFrame的单个列或一组列 |
df.ix[val] | 选取Dataframe的单个行或一组行 |
df.ix[:,val] | 选取单个列或列子集 |
df.ix[val1,val2] | 将一个或多个轴匹配到新索引 |
reindex方法 | 将一个或多个轴匹配到新索引 |
xs方法 | 根据标签选取单行或者单列,返回一个Series |
icol、irow方法 | 根据整数位置选取单列或单行,并返回一个Series |
get_value、set_value | 根据行标签和列标签选取单个值 |
运算:默认情况下,Dataframe和Series之间的算术运算会将Series的索引匹配到的Dataframe的列,沿着列一直向下传播。若索引找不到,则会重新索引产生并集。
2.DataFrame常用属性例程
# -*- coding: utf-8 -*-
"""
@author: 蔚蓝的天空Tom
DataFrame是一个表格型的数据结构,它含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔值等)。
DataFrame既有行索引也有列索引,它可以被看做由Series组成的字典(共用同一个索引)。
DataFrame可以通过类似字典的方式或者.columnname的方式将列获取为一个Series。
行也可以通过位置或名称的方式进行获取。
DataFrame常用属性
属性 说明
values DataFrame的值
index 行索引
index.name 行索引的名字
columns 列索引
columns.name 列索引的名字
ix 返回行的DataFrame
ix[[x,y,...], [x,y,...]] 对行重新索引,然后对列重新索引
T frame行列转置
"""
import pandas as pd
from pandas import DataFrame
if __name__=='__main__':
data = {'Name':['Tom','Kim','Andy'],
'Age':[18,16,19],
'Height':[1.6,1.5,1.7]}
ind = ['No.1', 'No.2', 'No.3']
df = pd.DataFrame(data, index=ind)
# Age Height Name
#No.1 18 1.6 Tom
#No.2 16 1.5 Kim
#No.3 19 1.7 Andy
#DataFram的值
v = df.values #<class 'numpy.ndarray'>
#[[18 1.6 'Tom']
# [16 1.5 'Kim']
# [19 1.7 'Andy']]
#行索引,用户没有自定义行索引index时,返回行索引魔人数值
ind = df.index #<class 'pandas.indexes.base.Index'>
#Index(['No.1', 'No.2', 'No.3'], dtype='object')
#行索引的名字,未设置时获取到None
iname = df.index.name
#None
#行索引的名字,先设置再获取
df.index.name = 'StudentID'
iname = df.index.name
#StudentID
#列索引
col = df.columns #<class 'pandas.indexes.base.Index'>
#Index(['Age', 'Height', 'Name'], dtype='object')
#列索引的名字, 未设置时为None
cname = df.columns.name
#None
#列索引的名字,先设置再获取
df.columns.name = 'StudentInfo'
cname = df.columns.name
#StudentInfo
#ix, 返回行的DataFrame
ret = df.ix[0] #返回第一行数据
#Age 18
#Height 1.6
#Name Tom
#Name: No.1, dtype: object
#ix, 返回行的DataFrame
ret = df.ix[1] #返回第二行数据, <class 'pandas.core.series.Series'>
#Age 16
#Height 1.5
#Name Kim
#Name: No.2, dtype: object
ret = df.ix[-1] #返回最后一行数据
#Age 19
#Height 1.7
#Name Andy
#Name: No.3, dtype: object
#ix[[rowx, rowy,...]] 对行重新索引,相等于DataFrame切片
ret = df.ix[[0,2]]
#StudentInfo Age Height Name
#StudentID
#No.1 18 1.6 Tom
#No.2 16 1.5 Kim
#ix[[rowx, rowy,...], [colx, coly, ...]]
ret = df.ix[[0,2], [0,1]]
#StudentInfo Age Height
#StudentID
#No.1 18 1.6
#No.3 19 1.7
#T frame行列转置
print('转置前:\n', df)
#转置前:
#StudentInfo Age Height Name
#StudentID
#No.1 18 1.6 Tom
#No.2 16 1.5 Kim
#No.3 19 1.7 Andy
print('转置前values:\n', df.values)
#转置前values:
# [[18 1.6 'Tom']
# [16 1.5 'Kim']
# [19 1.7 'Andy']]
dfT = df.T
print('转置后:\n', dfT)
#转置后:
#StudentID No.1 No.2 No.3
#StudentInfo
#Age 18 16 19
#Height 1.6 1.5 1.7
#Name Tom Kim Andy
print('转置后values:\n', dfT.values)
#转置后values:
# [[18 16 19]
# [1.6 1.5 1.7]
# ['Tom' 'Kim' 'Andy']]
print('转置前index.name:\n', df.index.name)
#StudentID
print('转置后index.name:\n', dfT.index.name)
#StudentInfo
print('转置前columns.name:\n', df.columns.name)
#StudentInfo
print('转置后columns.name:\n', dfT.columns.name)
#StudentID
3.DataFrame常用函数DataFrame()/reindex()/drop()
def DataFrame_manual():
'''
DataFrame类型类似于数据库表结构的数据结构,含有行索引和列索引
可以将DataFrame看成由相同索引的Series组成的Dict类型。
在其底层是通过二维以及一维的数据块实现
'''
import pandas as pd
from pandas import DataFrame
#1. DataFrame对象的创建
#1.1用包含等长的列表或者是NumPy数组的字典创建DataFrame对象
#建立等长列表的字典类型
data = {'Name':['Tom', 'Kim', 'Andy'],
'Age':[18, 16, 19],
'Height':[1.6, 1.5, 1.7]}
#建立DataFrame对象
#使用默认索引[0,1,2,....]
df = pd.DataFrame(data) #默认索引,默认列的顺序
# Age Height Name
# 0 18 1.6 Tom
# 1 16 1.5 Kim
# 2 19 1.7 Andy
#指定列的顺序
df = pd.DataFrame(data, columns=['Name', 'Age', 'Height'])
# Name Age Height
# 0 Tom 18 1.6
# 1 Kim 16 1.5
# 2 Andy 19 1.7
#指定DataFrame的索引
df = pd.DataFrame(data, index=['1st', '2nd', '3th'])
# Age Height Name
# 1st 18 1.6 Tom
# 2nd 16 1.5 Kim
# 3th 19 1.7 Andy
#1.2 用嵌套dict生成DataFrame对象
#用嵌套dict生成DataFrame,外部的dict索引会成为列名,内部的dict索引会成为行名
#生成的DataFrame会根据行索引排序
data = {'Name': {'1st':'Tom', '2nd':'Kim', '3th':'Andy'},
'Age': {'1st':18, '2nd':16, '3th':19},
'Height':{'1st':1.6, '2nd':1.5, '3th':1.7}}
df = pd.DataFrame(data) #使用嵌套dict指定的行序列,使用默认的列序列(列名字典排序)
# Age Height Name
# 1st 18 1.6 Tom
# 2nd 16 1.5 Kim
# 3th 19 1.7 Andy
df = pd.DataFrame(data, ['3th', '2nd', '1st']) #指定行的序列
# Age Height Name
# 3th 19 1.7 Andy
# 2nd 16 1.5 Kim
# 1st 18 1.6 Tom
#2访问DataFrame
#从DataFrame中获取一列的结果为一个Series,有两种方法
#2.1字典索引方式获取
data = {'Name':['Tom', 'Kim', 'Andy'],
'Age':[18, 16, 19],
'Height':[1.6, 1.5, 1.7]}
df = pd.DataFrame(data, columns=['Name', 'Age', 'Height'], index=['1st', '2nd', '3th'])
# Name Age Height
# 1st Tom 18 1.6
# 2nd Kim 16 1.5
# 3th Andy 19 1.7
s = df['Name']
# 1st Tom
# 2nd Kim
# 3th Andy
# Name: Name, dtype: object
#2.2通过ix获取一行数据
data = {'Name':['Tom', 'Kim', 'Andy'],
'Age':[18, 16, 19],
'Height':[1.6, 1.5, 1.7]}
df = pd.DataFrame(data,
columns=['Name', 'Age', 'Height'],
index=['1st', '2nd', '3th'])
s = df.ix['1st'] #获取单行,参数为 行索引值
# Name Tom
# Age 18
# Height 1.6
# Name: 1st, dtype: object
s = df.ix[0] #获取单行,参数 默认数字行索引
# Name Tom
# Age 18
# Height 1.6
# Name: 1st, dtype: object
s = df.ix[['3th', '2nd']]#获取多行
# Name Age Height
# 3th Andy 19 1.7
# 2nd Kim 16 1.5
s = df.ix[range(3)] #通过默认数字行索引获取数据
# Name Age Height
# 1st Tom 18 1.6
# 2nd Kim 16 1.5
# 3th Andy 19 1.7
#2.3获取指定行,指定列的交汇值
ret = df['Name']['1st'] #Tom
ret = df['Name'][0] #Tom
ret = df['Age']['1st'] #18
ret = df['Age'][0] #18
ret = df['Height']['1st']#1.6
ret = df['Height'][0] #1.6
#2.4获取指定列,指定行的交汇值
ret = df.ix['1st']['Name'] #Tom
ret = df.ix[0]['Name'] #Tom
ret = df.ix['1st']['Age'] #18
ret = df.ix[0]['Age'] #18
ret = df.ix['1st']['Height']#1.6
ret = df.ix[0]['Height'] #1.6
#3.修改DataFame对象
#3.1增加列
data = {'Name':['Tom', 'Kim', 'Andy'],
'Age':[18, 16, 19],
'Height':[1.6, 1.5, 1.7]}
df = pd.DataFrame(data,
columns=['Name', 'Age', 'Height'],
index=['1st', '2nd', '3th'])
df['Grade'] = 9 #增加一列,年级'Grade',为同一值9年级
# Name Age Height Grade
# 1st Tom 18 1.6 9
# 2nd Kim 16 1.5 9
# 3th Andy 19 1.7 9
#3.2修改一列的值
df['Grade'] = [6,7,7]
# Name Age Height Grade
# 1st Tom 18 1.6 6
# 2nd Kim 16 1.5 7
# 3th Andy 19 1.7 7
#3.3判断Grade是否为7年级
s = pd.Series([False, True, True], index=['1st', '2nd', '3th'])
df['HighGrade'] = s #新增一列'HighGrade',用Series赋值
# Name Age Height Grade HighGrade
# 1st Tom 18 1.6 6 False
# 2nd Kim 16 1.5 7 True
# 3th Andy 19 1.7 7 True
#4.命令DataFrame的行、列
data = {'Name':['Tom', 'Kim', 'Andy'],
'Age':[18, 16, 19],
'Height':[1.6, 1.5, 1.7]}
df = pd.DataFrame(data,
columns=['Name', 'Age', 'Height'],
index=['1st', '2nd', '3th'])
df.columns.name = 'Students'
df.index.name = 'ID'
# Students Name Age Height
# ID
# 1st Tom 18 1.6
# 2nd Kim 16 1.5
# 3th Andy 19 1.7
4.DataFrame排序函数
def DataFrame_Sort():
data = {'Name': {'No.1':'Tom', 'No.2':'Kim', 'No.3':'Andy'},
'Age': {'No.1':18, 'No.2':16, 'No.3':19},
'Height':{'No.1':1.6, 'No.2':1.5, 'No.3':1.7}}
df = pd.DataFrame(data)
df.index.name = 'ID'
df.columns.name = 'StudentInfo'
#StudentInfo Age Height Name
#ID
#No.1 18 1.6 Tom
#No.2 16 1.5 Kim
#No.3 19 1.7 Andy
#行索引排序,升序
ret = df.sort_index(ascending=True)
#StudentInfo Age Height Name
#ID
#No.1 18 1.6 Tom
#No.2 16 1.5 Kim
#No.3 19 1.7 Andy
#行索引排序,降序
ret = df.sort_index(ascending=False)
#StudentInfo Age Height Name
#ID
#No.3 19 1.7 Andy
#No.2 16 1.5 Kim
#No.1 18 1.6 Tom
#数据排序,按照指定列排序,降序
ret = df.sort_values(by='Age', ascending=True) #按照Age列降序排序
#StudentInfo Age Height Name
#ID
#No.2 16 1.5 Kim
#No.1 18 1.6 Tom
#No.3 19 1.7 Andy
#数据排序,按照指定列排序,升序
ret = df.sort_values(by='Age', ascending=False)
#StudentInfo Age Height Name
#ID
#No.3 19 1.7 Andy
#No.1 18 1.6 Tom
#No.2 16 1.5 Kim
5.DataFrame汇总统计函数
# -*- coding: utf-8 -*-
"""
@author: 蔚蓝的天空Tom
Aim:DataFrame的汇总统计功能函数
df.count() 非NaN的数量
df.describe() 一次性产生多个汇总统计
df.min() 最小值
df.min() 最大值
df.idxmax(axis=0, skipna=True) 返回含有最大值的index的Series
df.idxmin(axis=0, skipna=True) 返回含有最小值的index的Series
df.quantile(axis=0) 计算样本的分位数
df.sum(axis=0, skipna=True, level=NaN) 返回一个含有求和小计的Series
df.mean(axis=0, skipna=True, level=NaN) 返回一个含有平均值的Series
df.median(axis=0, skipna=True, level=NaN) 返回一个含有算术中位数的Series
df.mad(axis=0, skipna=True, level=NaN) 返回一个根据平均值计算平均绝对离差的Series
df.var(axis=0, skipna=True, level=NaN) 返回一个方差的Series
df.std(axis=0, skipna=True, level=NaN) 返回一个标准差的Series
df.skew(axis=0, skipna=True, level=NaN) 返回样本值的偏度(三阶距)
df.kurt(axis=0, skipna=True, level=NaN) 返回样本值的峰度(四阶距)
df.cumsum(axis=0, skipna=True, level=NaN) 返回样本的累计和
df.cummin(axis=0, skipna=True, level=NaN) 返回样本的累计最大值
df.cummax(axis=0, skipna=True, level=NaN) 返回样本的累计最小值
df.cumprod(axis=0, skipna=True, level=NaN) 返回样本的累计积
df.diff(axis=0) 返回样本的一阶差分
df.pct_change(axis=0) 返回样本的百分比数变化
"""
import pandas as pd
from pandas import DataFrame
if __name__=='__main__':
data = {'Name':['Tom', 'Kim', 'Andy'],
'Age':[18, 16, 19],
'Height':[1.6, 1.5, 1.7]}
ind = ['No.1', 'No.2', 'No.3']
df = pd.DataFrame(data, index=ind)
df.index.name = 'ID'
df.columns.name = 'StudentInfo'
#StudentInfo Age Height Name
#ID
#No.1 18 1.6 Tom
#No.2 16 1.5 Kim
#No.3 19 1.7 Andy
#df.count() 非NaN的数量
cnt = df.count()
#StudentInfo
#Age 3
#Height 3
#Name 3
#dtype: int64
#df.describe()一次性产生多个汇总统计(包括count, mean, std, min, max等)
ret = df.describe() #<class 'pandas.core.frame.DataFrame'>
#StudentInfo Age Height
#count 3.000000 3.00
#mean 17.666667 1.60
#std 1.527525 0.10
#min 16.000000 1.50
#25% 17.000000 1.55
#50% 18.000000 1.60
#75% 18.500000 1.65
#max 19.000000 1.70
#df.min() 最小值,每列的最小数值
ret = df.min()
#StudentInfo
#Age 16
#Height 1.5
#Name Andy
#dtype: object
#df.min() 最大值,每列的最大数值
ret = df.max()
#StudentInfo
#Age 19
#Height 1.7
#Name Tom
#dtype: object
#df.idxmax(axis=0, skipna=True) 返回含有最大值的index的Series
data = {'Age':[18,16,19],
'Height':[1.6, 1.5, 1.7],
'Math':[60, 70, 100],
'English':[98, 68, 69],
'Chinese':[50, 99, 70]}
ind = ['No.1', 'No.2', 'No.3']
df = pd.DataFrame(data, index=ind)
df.index.name = 'ID'
df.columns.name = 'Student'
#Student Age Chinese English Height Math
#ID
#No.1 18 50 98 1.6 60
#No.2 16 99 68 1.5 70
#No.3 19 70 69 1.7 100
#df.idxmin(axis=0, skipna=True) 返回含有最小值的index的Series
ret = df.idxmax(axis = 0) #<class 'pandas.core.series.Series'>
#Student
#Age No.3
#Chinese No.2
#English No.1
#Height No.3
#Math No.3
#dtype: object
#每行最大数据所在列名
ret = df.idxmax(axis = 1) #<class 'pandas.core.series.Series'>
#ID
#No.1 English
#No.2 Chinese
#No.3 Math
#dtype: object
#df.quantile(axis=0) 计算样本的分位数(有二分位数,四分位数等)
ret = df.quantile(axis = 0) #每列样本的中位数
#Student
#Age 18.0
#Chinese 70.0
#English 69.0
#Height 1.6
#Math 70.0
#dtype: float64
#df.sum(axis=0, skipna=True, level=NaN) 返回一个含有求和小计的Series
ret = df.sum(axis=0) #每列样本的总和
#Student
#Age 53.0
#Chinese 219.0
#English 235.0
#Height 4.8
#Math 230.0
#dtype: float64
ret = df.sum(axis=1) #每行数据的总和,从此样本看没有任何意义
#ID
#No.1 227.6
#No.2 254.5
#No.3 259.7
#dtype: float64
#df.mean(axis=0, skipna=True, level=NaN) 返回一个含有平均值的Series
ret = df.mean(axis=0) #每列样本的平均值
#Student
#Age 17.666667
#Chinese 73.000000
#English 78.333333
#Height 1.600000
#Math 76.666667
#dtype: float64
ret = df.mean(axis=1) #每行数据的平均值,以此样本看没有任何意义
#ID
#No.1 45.52
#No.2 50.90
#No.3 51.94
#dtype: float64
#df.median(axis=0, skipna=True, level=NaN) 返回一个含有算术中位数的Series
ret = df.median(axis=0) #每列样本的中位数
#Student
#Age 18.0
#Chinese 70.0
#English 69.0
#Height 1.6
#Math 70.0
#dtype: float64
ret = df.median(axis=1) #每行数据的中位数
#ID
#No.1 50.0
#No.2 68.0
#No.3 69.0
#dtype: float64
#df.mad(axis=0, skipna=True, level=NaN) 返回一个根据平均值计算平均绝对离差的Series
#绝对离差=单项数值与平均值之差的绝对值
#Student Age Chinese English Height Math
#ID
#No.1 18 50 98 1.6 60
#No.2 16 99 68 1.5 70
#No.3 19 70 69 1.7 100
ret = df.mad(axis=0) #逐列求值
#Student
#Age 1.111111
#Chinese 17.333333
#English 13.111111
#Height 0.066667
#Math 15.555556
#dtype: float64
ret = df.mad(axis=1) #逐行求值
#ID
#No.1 28.576
#No.2 33.720
#No.3 33.272
#dtype: float64
#df.var(axis=0, skipna=True, level=NaN) 返回一个方差的Series
ret = df.var(axis=0) #逐列操作求方差
#Student
#Age 2.333333
#Chinese 607.000000
#English 290.333333
#Height 0.010000
#Math 433.333333
#dtype: float64
ret = df.var(axis=1) #逐行操作求方差
#ID
#No.1 1417.552
#No.2 1657.300
#No.3 1634.018
#dtype: float64
#df.std(axis=0, skipna=True, level=NaN) 返回一个标准差的Series
ret = df.std(axis=0) #逐列求标准差
#Student
#Age 1.527525
#Chinese 24.637370
#English 17.039171
#Height 0.100000
#Math 20.816660
#dtype: float64
ret = df.std(axis=1) #逐行求标准差
#ID
#No.1 37.650392
#No.2 40.709950
#No.3 40.422989
#dtype: float64
#df.skew(axis=0, skipna=True, level=NaN) 返回样本值的偏度(三阶距)
ret = df.skew(axis=0) #逐列求样本值的偏度(三阶矩)
#Student
#Age -0.935220
#Chinese 0.539824
#English 1.725342
#Height 0.000000
#Math 1.293343
#dtype: float64
ret = df.skew(axis=1) #逐行求样本值的偏度(三阶矩)
#ID
#No.1 0.328682
#No.2 -0.245853
#No.3 -0.256661
#dtype: float64
#df.kurt(axis=0, skipna=True, level=NaN) 返回样本值的峰度(四阶距)
ret = df.kurt(axis=0) #逐列求样本值的峰度(四阶距)
#Student
#Age NaN
#Chinese NaN
#English NaN
#Height NaN
#Math NaN
#dtype: float64
ret = df.kurt(axis=1) #逐行求样本值的峰度(四阶距)
#ID
#No.1 -0.582437
#No.2 -2.079006
#No.3 -1.879115
#dtype: float64
#df.cumsum(axis=0, skipna=True, level=NaN) 返回样本的累计和
ret = df.cumsum(axis=0) #逐列求累积和
#Student Age Chinese English Height Math
#ID
#No.1 18.0 50.0 98.0 1.6 60.0
#No.2 34.0 149.0 166.0 3.1 130.0
#No.3 53.0 219.0 235.0 4.8 230.0
ret = df.cumsum(axis=1)#逐行求累积和
#Student Age Chinese English Height Math
#ID
#No.1 18.0 68.0 166.0 167.6 227.6
#No.2 16.0 115.0 183.0 184.5 254.5
#No.3 19.0 89.0 158.0 159.7 259.7
#df.cummin(axis=0, skipna=True, level=NaN) 返回样本的累计最小值
ret = df.cummin(axis=0) #逐列求累计最小值
#Student Age Chinese English Height Math
#ID
#No.1 18.0 50.0 98.0 1.6 60.0
#No.2 16.0 50.0 68.0 1.5 60.0
#No.3 16.0 50.0 68.0 1.5 60.0
ret = df.cummin(axis=1) #逐行求累计最小值
#Student Age Chinese English Height Math
#ID
#No.1 18.0 18.0 18.0 1.6 1.6
#No.2 16.0 16.0 16.0 1.5 1.5
#No.3 19.0 19.0 19.0 1.7 1.7
#df.cummax(axis=0, skipna=True, level=NaN) 返回样本的累计最大值
ret = df.cummax(axis=0) #逐列求累计最大值
#Student Age Chinese English Height Math
#ID
#No.1 18.0 50.0 98.0 1.6 60.0
#No.2 18.0 99.0 98.0 1.6 70.0
#No.3 19.0 99.0 98.0 1.7 100.0
ret = df.cummax(axis=1) #逐行求累计最大值
#Student Age Chinese English Height Math
#ID
#No.1 18.0 50.0 98.0 98.0 98.0
#No.2 16.0 99.0 99.0 99.0 99.0
#No.3 19.0 70.0 70.0 70.0 100.0
#df.cumprod(axis=0, skipna=True, level=NaN) 返回样本的累计积
ret = df.cumprod(axis=0) #逐列求累计积
#Student Age Chinese English Height Math
#ID
#No.1 18.0 50.0 98.0 1.60 60.0
#No.2 288.0 4950.0 6664.0 2.40 4200.0
#No.3 5472.0 346500.0 459816.0 4.08 420000.0
ret = df.cumprod(axis=1) #逐行求累计积
#Student Age Chinese English Height Math
#ID
#No.1 18.0 900.0 88200.0 141120.0 8467200.0
#No.2 16.0 1584.0 107712.0 161568.0 11309760.0
#No.3 19.0 1330.0 91770.0 156009.0 15600900.0
#df.diff(axis=0) 返回样本的一阶差分
ret = df.diff(axis=0) #逐列求一阶差分
#Student Age Chinese English Height Math
#ID
#No.1 NaN NaN NaN NaN NaN
#No.2 -2.0 49.0 -30.0 -0.1 10.0
#No.3 3.0 -29.0 1.0 0.2 30.0
ret = df.diff(axis=1) #逐行求一阶差分
#<class 'pandas.core.frame.DataFrame'>
#Student Age Chinese English Height Math
#ID
#No.1 NaN 32.0 48.0 NaN -38.0
#No.2 NaN 83.0 -31.0 NaN 2.0
#No.3 NaN 51.0 -1.0 NaN 31.0
#df.pct_change(axis=0) 返回样本的百分比数变化
ret =df.pct_change(axis=0) #逐列求百分比数变化
#Student Age Chinese English Height Math
#ID
#No.1 NaN NaN NaN NaN NaN
#No.2 -0.111111 0.980000 -0.306122 -0.062500 0.166667
#No.3 0.187500 -0.292929 0.014706 0.133333 0.428571
ret = df.pct_change(axis=1) #逐行求百分比数变化
#Student Age Chinese English Height Math
#ID
#No.1 NaN 1.777778 0.960000 -0.983673 36.500000
#No.2 NaN 5.187500 -0.313131 -0.977941 45.666667
#No.3 NaN 2.684211 -0.014286 -0.975362 57.823529
6.DataFrame计算函数
# -*- coding: utf-8 -*-
"""
@author: 蔚蓝的天空Tom
Aim:实现DataFrame的计算函数的示例
df.add(df2, fill_value=NaN, axist=1) 元素级相加,对齐时找不到元素默认用fill_value
df.sub(df2, fill_value=NaN, axist=1) 元素级相减,对齐时找不到元素默认用fill_value
df.div(df2, fill_value=NaN, axist=1) 元素级相除,对齐时找不到元素默认用fill_value
df.mul(df2, fill_value=NaN, axist=1) 元素级相乘,对齐时找不到元素默认用fill_value
df.apply(f, axis=0) 将f函数应用到由各行各列所形成的一维数组上
df.applymap(f) 将f函数应用到各个元素上
df.cumsum(axis=0, skipna=True) 累加,返回累加后的dataframe
"""
import pandas as pd
from pandas import DataFrame
if __name__=='__main__':
data = {'Math':[2, 4, 6],
'English':[4, 8, 12]}
ind = ['No.1', 'No.2', 'No.3']
df1 = pd.DataFrame(data, index=ind)
df1.index.name = 'ID'
df1.columns.name = 'Student'
#Student English Math
#ID
#No.1 4 2
#No.2 8 4
#No.3 12 6
data = {'Math':[1,2,3],
'English':[2,4,6]}
ind = ['No.1', 'No.2', 'No.3']
df2 = pd.DataFrame(data, index=ind)
df2.index.name = 'ID'
df2.columns.name = 'Student'
#Student English Math
#ID
#No.1 2 1
#No.2 4 2
#No.3 6 3
#df.add(df2, fill_value=NaN, axist=1) 元素级相加,对齐时找不到元素默认用fill_value
ret = df1.add(df2) #对应元素相加
#Student English Math
#ID
#No.1 6 3
#No.2 12 6
#No.3 18 9
#df.sub(df2, fill_value=NaN, axist=1) 元素级相减,对齐时找不到元素默认用fill_value
ret = df1.sub(df2) #对应元素相减
#Student English Math
#ID
#No.1 2 1
#No.2 4 2
#No.3 6 3
#df.div(df2, fill_value=NaN, axist=1) 元素级相除,对齐时找不到元素默认用fill_value
ret = df1.div(df2) #对应元素相除
#Student English Math
#ID
#No.1 2.0 2.0
#No.2 2.0 2.0
#No.3 2.0 2.0
#df.mul(df2, fill_value=NaN, axist=1) 元素级相乘,对齐时找不到元素默认用fill_value
ret = df1.mul(df2) #对应元素相乘
#Student English Math
#ID
#No.1 8 2
#No.2 32 8
#No.3 72 18
#df.apply(f, axis=0) 将f函数应用到由各行各列所形成的一维数组上
#Student English Math
#ID
#No.1 4 2
#No.2 8 4
#No.3 12 6
import numpy as np
ret = df1.apply(np.square) #对每个元素进行开平方np.squre
#Student English Math
#ID
#No.1 16 4
#No.2 64 16
#No.3 144 36
#df.applymap(f) 将f函数应用到各个元素上
ret = df1.applymap(np.square)
#Student English Math
#ID
#No.1 16 4
#No.2 64 16
#No.3 144 36
#df.cumsum(axis=0, skipna=True) 累加,返回累加后的dataframe
#Student English Math
#ID
#No.1 4 2
#No.2 8 4
#No.3 12 6
ret = df1.cumsum(axis=0) #对每列内的元素,进行累加
#Student English Math
#ID
#No.1 4 2
#No.2 12 6
#No.3 24 12
ret = df1.cumsum(axis=1) #对每行内的元素,进行累加
#Student English Math
#ID
#No.1 4 6
#No.2 8 12
#No.3 12 18
7.DataFrame常用索引方式例程
# -*- coding: utf-8 -*-
"""
@author: 蔚蓝的天空Tom
Aim:完成DataFrame的索引方式的示例----df[], df.ix[], df.reindex(), df.xs(), df.icol()等
索引方式 说明
df[val] 选取DataFrame的单个列或一组列
df.ix[val] 选取Dataframe的单个行或一组行
df.ix[:,val] 选取单个列或列子集
df.ix[val1,val2] 将一个或多个轴匹配到新索引
reindex方法 将一个或多个轴匹配到新索引
xs方法 根据标签选取单行或者单列,返回一个Series
icol、irow方法 根据整数位置选取单列或单行,并返回一个Series
get_value、set_value 根据行标签和列标签选取单个值
"""
import pandas as pd
from pandas import DataFrame
if __name__=='__main__':
data = {'Name':['Tom', 'Kim', 'Andy'],
'Age':[18, 16, 19],
'Math':[95, 98, 96]}
ind = ['No.1', 'No.2', 'No.3']
df = pd.DataFrame(data, index=ind, columns=['Name', 'Age', 'Math'])
df.index.name = 'ID'
df.columns.name = 'Student'
#Student Name Age Math
#ID
#No.1 Tom 18 95
#No.2 Kim 16 98
#No.3 Andy 19 96
#选取DataFrame的单个列
ret = df[[0]] #df的第1列
#Student Name
#ID
#No.1 Tom
#No.2 Kim
#No.3 Andy
ret = df[[-1]] #df的最后一列
#Student Math
#ID
#No.1 95
#No.2 98
#No.3 96
ret = df[[-1, 0]] #df的最后一列和第一列
#Student Math Name
#ID
#No.1 95 Tom
#No.2 98 Kim
#No.3 96 Andy
#df.ix[val] 选取Dataframe的单个行或一组行
ret = df.ix[[0]] #df的第一行
#Student Name Age Math
#ID
#No.1 Tom 18 95
ret = df.ix[[-1]] #df的最后一行
#Student Name Age Math
#ID
#No.3 Andy 19 96
ret = df.ix[[-1,0]] #df的最后一行和第一行
#Student Name Age Math
#ID
#No.3 Andy 19 96
#No.1 Tom 18 95
#df.ix[:,val] 选取单个列或列子集
ret = df.ix[0:2, [0]] #第一列中从0到1序号的列子集
#Student Name
#ID
#No.1 Tom
#No.2 Kim
ret = df.ix[:-1, [0]] #第一列中不包含最后一个元素的列子集
#Student Name
#ID
#No.1 Tom
#No.2 Kim
#df.ix[val1,val2] 将一个或多个轴匹配到新索引
ret = df.ix[[0], [0]] #求第一行第一列元素
#Student Name
#ID
#No.1 Tom
ret = df.ix[[0], [1]] #求第一行第二列元素
#Student Age
#ID
#No.1 18
ret = df.ix[[1], [0]] #求第2行第一列元素
#Student Name
#ID
#No.2 Kim
df.reindex()+df.xs()+df.iloc[] + df.get_value() + df.get_values() + df.set_value()
import pandas as pd
from pandas import DataFrame
if __name__=='__main__':
data = {'Name':['Tom', 'Kim', 'Andy'],
'Age':[18, 16, 19],
'Height':[1.7, 1.5, 1.6]}
ind = ['No.1', 'No.2', 'No.3']
df = pd.DataFrame(data, index=ind, columns=['Name', 'Age', 'Height'])
df.index.name = 'ID'
df.columns.name = 'Student'
#Student Name Age Height
#ID
#No.1 Tom 18 1.7
#No.2 Kim 16 1.5
#No.3 Andy 19 1.6
#reindex方法 将一个或多个轴匹配到新索引
ret = df.reindex(index=['No.3', 'No.2', 'No.1']) #按照指定的行索引显示
#Student Name Age Height
#ID
#No.3 Andy 19 1.6
#No.2 Kim 16 1.5
#No.1 Tom 18 1.7
ret = df.reindex(index=['No.3', 'No.2', 'No.1'], columns=['Name', 'Age'])
#Student Name Age
#ID
#No.3 Andy 19.0
#No.2 Kim 16.0
#No. NaN NaN
ret = df.reindex(index=['No.1'], columns=['Name', 'Age'])
#Student Name Age
#ID
#No.1 Tom 18
ret = df.reindex(index=['No.1'], columns=['Name'])
#Student Name
#ID
#No.1 Tom
#xs方法 根据标签选取单行或者单列,返回一个Series
ret = df.xs(key='No.1', axis=0)#获取由key指定的行No.1,必须设置axis=0
#Student
#Name Tom
#Age 18
#Height 1.7
#Name: No.1, dtype: object
ret = df.xs(key='Name', axis=1) #获取由key指定的列Name,必须设置axis=1
#ID
#No.1 Tom
#No.2 Kim
#4No.3 Andy
#Name: Name, dtype: object
ret = df.xs(key='Age', axis=1) #获取由key指定的列Age,必须设置axis=1
#ID
#No.1 18
#No.2 16
#No.3 19
#Name: Age, dtype: int64
#icol、irow方法 根据整数位置选取单列或单行,并返回一个Series
ret = df.iloc[:,0] #获取每行的第一列元素,即获取df的第一列
#ID
#No.1 Tom
#No.2 Kim
#No.3 Andy
#Name: Name, dtype: object
ret = df.iloc[:,-1] #获取每行的最后一列元素,即获取df的最后一列
#ID
#No.1 1.7
#No.2 1.5
#No.3 1.6
#Name: Height, dtype: float64
ret = df.iloc[:-1, 0]
#ID
#No.1 Tom
#No.2 Kim
#Name: Name, dtype: object
ret = df.iloc[:1,0] #<class 'pandas.core.series.Series'>
#ID
#No.1 Tom
#Name: Name, dtype: object
ret = df.iloc[0, 0] #<class 'str'>
#Tom
#ret = df.irow()
ret = df.iloc[0] #获取第一行
#Student
#Name Tom
#Age 18
#Height 1.7
#Name: No.1, dtype: object
ret = df.iloc[-1] #获取最后一行
#Student
#Name Andy
#Age 19
#Height 1.6
#Name: No.3, dtype: object
#get_value、set_value 根据行标签和列标签选取单个值
ret = df.get_value(index='No.1', col='Name')
#Tom
ret = df.get_value(index='No.1', col='Age')
#18
ret = df.get_values()
#[['Tom' 18 1.7]
# ['Kim' 16 1.5]
# ['Andy' 19 1.6]]
#set_value(index, col, value) 设置[index, col]元素数值为value
ret = df.set_value(index='No.1', col='Name', value='John')
print(df.get_values())
#[['John' 18 1.7]
# ['Kim' 16 1.5]
# ['Andy' 19 1.6]]
8.DataFrame的方法示例汇总
def DataFrame_manual():
'''
DataFrame类型类似于数据库表结构的数据结构,含有行索引和列索引
可以将DataFrame看成由相同索引的Series组成的Dict类型。
在其底层是通过二维以及一维的数据块实现
'''
import pandas as pd
from pandas import DataFrame
#1. DataFrame对象的创建
#1.1用包含等长的列表或者是NumPy数组的字典创建DataFrame对象
#建立等长列表的字典类型
data = {'Name':['Tom', 'Kim', 'Andy'],
'Age':[18, 16, 19],
'Height':[1.6, 1.5, 1.7]}
#建立DataFrame对象
#使用默认索引[0,1,2,....]
df = pd.DataFrame(data) #默认索引,默认列的顺序
# Age Height Name
# 0 18 1.6 Tom
# 1 16 1.5 Kim
# 2 19 1.7 Andy
#指定列的顺序
df = pd.DataFrame(data, columns=['Name', 'Age', 'Height'])
# Name Age Height
# 0 Tom 18 1.6
# 1 Kim 16 1.5
# 2 Andy 19 1.7
#指定DataFrame的索引
df = pd.DataFrame(data, index=['1st', '2nd', '3th'])
# Age Height Name
# 1st 18 1.6 Tom
# 2nd 16 1.5 Kim
# 3th 19 1.7 Andy
#1.2 用嵌套dict生成DataFrame对象
#用嵌套dict生成DataFrame,外部的dict索引会成为列名,内部的dict索引会成为行名
#生成的DataFrame会根据行索引排序
data = {'Name': {'1st':'Tom', '2nd':'Kim', '3th':'Andy'},
'Age': {'1st':18, '2nd':16, '3th':19},
'Height':{'1st':1.6, '2nd':1.5, '3th':1.7}}
df = pd.DataFrame(data) #使用嵌套dict指定的行序列,使用默认的列序列(列名字典排序)
# Age Height Name
# 1st 18 1.6 Tom
# 2nd 16 1.5 Kim
# 3th 19 1.7 Andy
df = pd.DataFrame(data, ['3th', '2nd', '1st']) #指定行的序列
# Age Height Name
# 3th 19 1.7 Andy
# 2nd 16 1.5 Kim
# 1st 18 1.6 Tom
#2访问DataFrame
#从DataFrame中获取一列的结果为一个Series,有两种方法
#2.1字典索引方式获取
data = {'Name':['Tom', 'Kim', 'Andy'],
'Age':[18, 16, 19],
'Height':[1.6, 1.5, 1.7]}
df = pd.DataFrame(data, columns=['Name', 'Age', 'Height'], index=['1st', '2nd', '3th'])
# Name Age Height
# 1st Tom 18 1.6
# 2nd Kim 16 1.5
# 3th Andy 19 1.7
s = df['Name']
# 1st Tom
# 2nd Kim
# 3th Andy
# Name: Name, dtype: object
#2.2通过ix获取一行数据
data = {'Name':['Tom', 'Kim', 'Andy'],
'Age':[18, 16, 19],
'Height':[1.6, 1.5, 1.7]}
df = pd.DataFrame(data,
columns=['Name', 'Age', 'Height'],
index=['1st', '2nd', '3th'])
s = df.ix['1st'] #获取单行,参数为 行索引值
# Name Tom
# Age 18
# Height 1.6
# Name: 1st, dtype: object
s = df.ix[0] #获取单行,参数 默认数字行索引
# Name Tom
# Age 18
# Height 1.6
# Name: 1st, dtype: object
s = df.ix[['3th', '2nd']]#获取多行
# Name Age Height
# 3th Andy 19 1.7
# 2nd Kim 16 1.5
s = df.ix[range(3)] #通过默认数字行索引获取数据
# Name Age Height
# 1st Tom 18 1.6
# 2nd Kim 16 1.5
# 3th Andy 19 1.7
#2.3获取指定行,指定列的交汇值
ret = df['Name']['1st'] #Tom
ret = df['Name'][0] #Tom
ret = df['Age']['1st'] #18
ret = df['Age'][0] #18
ret = df['Height']['1st']#1.6
ret = df['Height'][0] #1.6
#2.4获取指定列,指定行的交汇值
ret = df.ix['1st']['Name'] #Tom
ret = df.ix[0]['Name'] #Tom
ret = df.ix['1st']['Age'] #18
ret = df.ix[0]['Age'] #18
ret = df.ix['1st']['Height']#1.6
ret = df.ix[0]['Height'] #1.6
#3.修改DataFame对象
#3.1增加列
data = {'Name':['Tom', 'Kim', 'Andy'],
'Age':[18, 16, 19],
'Height':[1.6, 1.5, 1.7]}
df = pd.DataFrame(data,
columns=['Name', 'Age', 'Height'],
index=['1st', '2nd', '3th'])
df['Grade'] = 9 #增加一列,年级'Grade',为同一值9年级
# Name Age Height Grade
# 1st Tom 18 1.6 9
# 2nd Kim 16 1.5 9
# 3th Andy 19 1.7 9
#3.2修改一列的值
df['Grade'] = [6,7,7]
# Name Age Height Grade
# 1st Tom 18 1.6 6
# 2nd Kim 16 1.5 7
# 3th Andy 19 1.7 7
#3.3判断Grade是否为7年级
s = pd.Series([False, True, True], index=['1st', '2nd', '3th'])
df['HighGrade'] = s #新增一列'HighGrade',用Series赋值
# Name Age Height Grade HighGrade
# 1st Tom 18 1.6 6 False
# 2nd Kim 16 1.5 7 True
# 3th Andy 19 1.7 7 True
#4.命令DataFrame的行、列
data = {'Name':['Tom', 'Kim', 'Andy'],
'Age':[18, 16, 19],
'Height':[1.6, 1.5, 1.7]}
df = pd.DataFrame(data,
columns=['Name', 'Age', 'Height'],
index=['1st', '2nd', '3th'])
df.columns.name = 'Students'
df.index.name = 'ID'
# Students Name Age Height
# ID
# 1st Tom 18 1.6
# 2nd Kim 16 1.5
# 3th Andy 19 1.7
if __name__=='__main__':
pandas_manual()
#Series_manual()
#DataFrame_manual()
(end)