Python:pandas(三)——DataFrame

官方文档:pandas之DataFrame

1、构造函数

用法

pandas.DataFrame(
    data=None,
    index=None,
    columns=None,
    dtype=None,
)

参数

参数 类型 说明
data ndarray、iterable、dict、DataFrame 用于构造DataFrame的数据(注意,用某个DataFrame构造另一个DataFrame,可能会导致同步修改的问题;如果要得到某个DataFrame的副本,可以用df.copy())
index Index或array 索引行,即第一行,通常为属性1,属性2,……
columns Index或array  索引列,即第一列,通常为0,1,2,……

例子

 1 import pandas as pd
 2 
 3 person={
 4 'Name':["Braund,Mr.OwenHarris",
 5 "Allen,Mr.WilliamHenry",
 6 "Bonnell,Miss.Elizabeth",],
 7 'Age':[22,35,58],
 8 'Sex':["male","male","female"],
 9 }
10 person_df=pd.DataFrame(person)
11 
12 #显示出来
13 person_df
14     Name Age Sex
15 0 Braund,Mr.OwenHarris 22 male
16 1 Allen,Mr.WilliamHenry 35 male
17 2 Bonnell,Miss.Elizabeth 58 female

 

2、属性

访问方式为:df.xxx

访问某一列:df.列名、df['列名'] 得到的是Series类型的数据

访问某一行:df.loc[行标签]、df.iloc[行号]

Series转List:list(ser)

改每列索引(第一行):df.columns = [A,B,C……]

改每行索引(第一列):df.index = [A,B,C,…… ] 或 df.set_index(...)

属性

说明

at 通过行/列标签访问单个值(如dataframe.at[1,'B'])
axes 返回一个List,其中每个元素记录了其对应axes的全部索引值
columns 列标签
index 行标签
dtypes DataFrame中值的类型
empty 指示器,指示该DataFrame是否为空
iat 区别于at,是用整数索引的方式访问单个值,如dataframe.iat[1,2]表示第2行第3列(即at中的第C列)
loc 通过①行/列标签组②布尔数组的形式访问一组数据,方式②的作用方式同布尔索引
iloc 通过整数整数List的方式访问一组数据,详见下边的iloc部分
ndim 维数
shape

返回一个tuple,表示各个维度的大小

shape[0]:行数、shape[1]:列数

size 元素数、单元格的数量
style 返回Style对象
values 返回该DataFrame的array形式(建议用方法to_numpy()

2.5、部分属性的详细说明

2.5.1、访问单个值:at与iat

①at

用法:df.at[ 1 , 'B' ]——访问行1,列'B'的值

②iat

用法:df.iat[ 1 , 1 ]——访问行1,列1(即列'B')的值

2.5.2、访问多个值:loc与iloc

①loc

说明

通过行/列标签组布尔索引组的形式访问一组数据

用法

df.loc[ 输入1 [, 输入2] ]

输入1表示哪些行,输入2表示哪些列

允许输入的值

  • 单个label,如5、'a';必须是label中有的值,不能用数字代指某列
  • label的list,如['a' ,'b' , 'c'];
  • 切片,如 'a':'f'(从'a'到'f',a与f均包含),:(全部行)。
  • 与对应维度尺寸大小相同的boolean array,如[True , False , True]
  • alignable boolean Series
  • callable函数(只有一个输入参数且必须是Series或DataFrame类型),返回一个合法的以上所说的类型

例子

1)访问第2,3列

df.iloc[:,[2,3]]

2)

访问某一列:df.列名、df['列名'] 得到的是Series类型的数据

访问某一行:df.loc[行标签]、df.iloc[行号]

3)

df.loc[pd.Series([False, True, False],
       index=['viper', 'sidewinder', 'cobra'])]

其中Series的index必须与DataFrame中对应维度的index相同,这等价于用法d直接写

df.loc[[False, False, True]]

对于使用callable函数的例子

df.loc[lambda df : df ['shield'] ==8 ] #提取df中shield列==8的行

4)取Series的一个值

ser[4]:取ser的第五个值

②iloc

与loc的区别在于,iloc只接受整数值(从0到length-1)和boolean array

接受的输入值:

  • 单个整数,如5;
  • 整数的list或array,如[ 4 , 3 , 0 ]
  • 整数切片,如1:7;也可以用冒号:,代表全部行/列
  • boolean array
  • callable函数,接受一个参数(Series或DataFrame),返回值为上文a到d中的类型

补充:

如果想用loc提取某一列的最后一号元素,那么loc[i,j]中的i不能写为-1,可以这样写:

lastEle = df.loc[df.index[-1],column_name]

③访问某一列

df.列名 或 df['列名'] 的方式访问某一列

该方式只能访问一列,如果要访问多列请用上文①②讲的方法。

2.5.3、返回DataFrame的array形式:values

返回值类型为numpy.ndarray

只返回DataFrame中的值,而不返回label行和列。

官方文档中推荐用df.to_numpy()代替。

 

三种将DataFrame转化为ndarray的方法:

#假设df是一个DataFrame

#df→ndarray
df_array=df.values
df_array=df.to_numpy()
df_array=np.array(df)

 

2.5.4、检查DataFrame是否为空:empty

df.empty:如果df.empty中没有任何元素,就会返回True

 

3、方法

用法为:df.xxx( ... )

方法

说明

abs 返回绝对值化的DataFrame
add
add_prefix 所有列label加前缀
add_suffix 所有列label加后缀
agg 用函数或函数list对DataFrame中的每一列元素进行聚合,聚合结果保存为新行,一个函数对应一行
aggregate 同agg
align 连接两个对象
all 返回是否所有元素都为True
any 返回是否存在元素为True
append 在末尾加一行或几行
apply 对某个上的元素用某个函数,返回调用函数后的值组成的DataFrame
applymap 对所有元素用某个函数(相当于map之于list
asfreq 将TimeSeries以固定的频率扩展为更大的TimeSeries
asof 返回指定行及之前最后一个没有NaN值的行
assign 添加一个新列
astype 将DataFrame中的数据类型转化为指定类型
at_time 选择时间列为一天中的指定时间的行
between_time 选择时间列为指定时间之间的行
backfill 等价于DataFrame.fillna()中将参数method指定为'bfill'
bfill 同backfill
bool 将单个boolean元素转化为bool数据并返回
boxplot 以各列为原始数据绘制箱型图
clip 将所有数据整理为指定区间内的值,不在该区间内自动划分为区间两端的值
combine 将两个DataFrame按照给定函数的方式进行合并
combine_first 将一个DataFrame中的NaN值填充为另一个DataFrame中对应位置的值
compare 对两个DataFrame进行比较,并罗列出二者的不同之处
convert_dtypes 将每一列的类型设置为其中元素最可能的类型
copy 得到一个当前DataFrame的副本
corr 得到一个DataFrame中各列的相关性矩阵
corrwith 得到两个DataFrame中各列间的相关性矩阵
count 计算每行/列中的非NaN元素数
cov 计算各列间的协方差矩阵
cummax 以累积递增的方式获取每行及之前的最大值
cummin 以累积递减的方式获取每行及之前的最小值
cumprod 以累积的方式获取每行及之前所有值的乘积
cumsum 以累积的方式获取每行及之前所有值的和
describe 产生一个描述性的统计数据
diff 获取每一行与上一行之差并填充到该行
div 除以某个值
rdiv 被哪个值除
divide 同div
dot 计算两个矩阵的点积/数量级
drop 删除特定的行/列
drop_duplicates 删除重复行(或某一列上的重复值),返回删除后的新DataFrame
droplevel 删除多索引中的某一索引行/列
dropna 删除包含空值的行/列
duplicated 返回一个boolean Series,每行标识该行是否与之前出现的行重复
eq df.eq(100) 等价于 df==100
equals 比较两个DataFrame是否完全相同,返回True或False
eval 对DataFrame中的列执行某个以string方式给出的表达式
ewm 指数加权滑动
ewma 指数加权滑动平均
expanding

指定窗口进行滑动运算

窗口:一次考虑多少行的数据

explode 将List类型的数据扩展成DataFrame的一行
ffill 等同于DataFrame.fillna()的参数method='ffill'的情况
fillna 用特定的方法填充DataFrame中的空值
filter 对索引行/列的名称进行过滤(可以用正则、部分字符等)得到筛选后的行/列
first 返回时间序列中最开始的若干天所在的行,(此处的最开始是日期上连续的几天,而不是前几行)
first_valid_index 返回第一个没有空值的行索引
floordiv 除以一个数并向下取整
from_dict 从一个dict创建DataFrame
from_records 从一个ndarray创建DataFrame
ge 大于等于特定值
groupby 用一个映射器或Series对DataFrame进行聚簇
gt 大于特定值
head 前若干列
hist 各列的直方图
idxmax 各列中最大值的行索引(或相反)
idxmin 各列中最小值的行索引(或相反)
infer_objeccts 尝试推测一个object类型列的最优类型
info 该DataFrame的详细信息总结
insert 将一列插入到DataFrame的特定位置
interpolate 用特定的插值方法填充空值
isin 检测元素值是否包含在给定的值中
isna

检查空值

返回一个DF,如果是NaN,则替换为True,否则替换为False

isnull
items 以迭代的方式访问每列
iteritems 同上
iterrows 以迭代的方式访问每行
itertuples 同上,区别在于每行会视为一个namedtuple
join 连接两个DataFrame
keys 返回info axis
kurt 返回指定维度上的无偏峰度
kurtosis 同上
last 返回时间序列中最后的若干天所在的行,(此处的最开始是日期上连续的几天,而不是后几行)
last_valid_index 返回最后一个没有空值的行的索引
le 小于等于某个值
lt 小于某个值
mad 平均绝对离差
max 最大值
mean 平均值
median 中值
melt 行列转换,用法同pandas(二)中的melt
mask 填充某些位置进行判断为True为特定的值
merge 用两个不同的列对两个DataFrame进行连接
min 最小值
mod 除以一个数,计算余数
mul 乘以一个数
multiply 同上
ne 不等于某个值
nlargest 对指定列降序输出前n行
notna

检测非空值

返回一个DF,其中所有的NaN会被替换为False,非NaN则被替换为True

notnull
nsmallest 对指定列升序输出前n行
nunique 计算不同列上的不重复的值数量
pad 等同于DataFrame.fillna()的参数method='ffill'的情况
pct_change 检测该行与上一行值相比变化的百分比
pipe 对DataFrame应用某个函数
pivot 用给定的索引重组织DataFrame
plot 绘图
pop 删除并返回指定列
pow 幂指数
prod 乘积
product 乘积
quantile 百分比分位符,结果中计算每个分位符处的值(以列为单位计算)
query 给出一个string形式的boolean表达式, query函数将查询所有符合该表达式的行
rank 计算每行的数字等级 
reindex 重建标签列(保留已有的值,空值填充新值)
reindex_like 用另一个DataFrame标签列的所有项去查找某个DataFrame中的这些项
rename 更改标签列的所有标签的名字
rename_axis 为每个轴设置名字
reorder_levels  给index重排序
replace 把其中的某些值替换为其他值或其他某些值
resample 对一系列时间数据行进行重采样
reset_index 重设置标签列,旧的标签列被替换为0、1、2…… 
rolling  滑动窗口计算
round 所有项四舍五入
rpow 把所有项都作为指数,参数项作为底数进行幂运算
sample 随机采样取一些行
select_dtypes 选择数据项类型为某个类型的列
sem 计算某些轴上的SEM(无偏标准误差)
set_axis 重新设置某个轴上的标签值
set_flags  设置flags,该项决定了是否允许重复的标签存在
set_index  用已存在的列重新设置标签 
shift  部分行/列下移(右移),用一些值填充原来的值
skew  无偏系数
sort_index 根据标签列进行重排序
sort_values 根据某列的值进行重排序
squeeze  把只有单个数据的Series压缩为一个数值,把只有一列的DataFrame压缩为一列
stack 把DataFrame的列标签变成一个行标签的多个部分,每个部分单独赋值
std  样本标准差
sum 指定轴求和 
swapaxes  交换两个轴 
tail 后几行的数据 
take  提取指定行、列
to_csv 把该DataFrame写入CSV文件
to_excel   
to_numpy  把该DataFrame转化为一个Ndarray 
to_period

把DataFrame从DatetimeIndex转化为PeriodIndex

to_records 把该DataFrame转化为Numpy record array 
to_timestamp 把时间类型的标签转化为时间戳类型 
transform 所有项都调用某个函数
transpose 转置,包括行列标签
truncate 截取部分行或列之间的数据
unstack 反转stack的变化,把属性变为实际的列
update 用另一个DataFrame的数据更新该DataFrame的数据
value_counts 统计重复行的个数
var 房差
where 用某些值替代不符合判断表达式的值

3.5、把这些函数、属性按类别划分

属性及潜在的信息
index 行标签(首列)
columns 列标签(首行)
dtypes 类型
info() 详细信息总结
select_dtypes() 筛选数据类型为某些类型的列
values DataFrame的Ndarray形式(建议用函数to_numpy)
axes 各个轴的标签
ndim 维度
size 元素个数
shape 各维度的长度
empty 该DataFrame是否为空
set_flags() 设置flag
转化
astype() 将该DataFrame类型转化为另一种类型
convert_dtypes() 将该DataFrame各列的类型转化为它最有可能的类型
infer_objects() 尝试为object类型列探寻最适合的类型
copy() 副本
bool() 返回单个元素的bool类型值
索引、迭代
head() 前几行的数据
tail() 后几行的数据
at 用行列索引的方式访问单个值
iat 用整数索引的方式访问单个值
loc 用行列索引的方式访问一组值
iloc 用整数索引的方式访问一组值
insert() 在特定的位置插入一列
__iter__() 在信息轴(info axis)上迭代
items() 迭代每列,每次两个迭代项label和content
iteritems() 同上
keys() 得到信息轴(info axis)
iterrows() 迭代每行
itertuples() 迭代每行,迭代都将每行的内容都作为一个namedtuple
pop() 删除并返回DataFrame的最后一行
get() 获得指定key对应列
isin() DataFrame中的数据是否包含在给定的一块数据中(结果为boolean DataFrame)
where() 将数据进行逻辑表达式判断为假的值设置为给定值(结果为boolean DataFrame)
mask() 将数据进行逻辑表达式判断为真的值设置为给定值(结果为boolean DataFrame)
query() 用给定的string类型的布尔表达式筛选符合的列

二元运算

(r前缀表示两个运算数字位置相反)

(以下皆为函数)

add、radd
sub、rsub
mul、rmul
div、rdiv 浮点除
truediv、rtruediv 浮点除
floordiv、rfloordiv 整除
mod、rmod 取余
pow、rpow 幂运算
dot 点积、数量积
le、lt(以下三行可以直接用对应的数学公式代替) 小于等于、小于
ge、gt 大于等于、大于
eq、ne 等于、不等于
整体运用函数、聚簇(GroupBy)、窗口
apply 对一个轴的所有元素运算
applymap 对所有元素进行函数运算
pipe 对DataFrame应用函数
agg 对指定的轴上的元素进行聚合(sum、max等)运算  
aggregate
transform 用函数对DataFrame的数据进行变形,返回变形后的DataFrame
groupby 用聚簇函数对某个轴上的所有数据进行聚簇
rolling  滑动窗口运算(一次用若干个连续的数据进行运算)
expanding  膨胀窗口运算(不固定窗口,而是窗口在运算过程中扩展变大)
ewm 指数加权滑动
计算、描述、统计状态  
abs 绝对值
all 是否全部元素都为真(一行/列作为一个结果)
any 是否存在真值(一行/列作为一个结果)
clip 用一个阈值范围检查所有数据,把不在范围内数据代之以阈值边界的值
corr 相关性矩阵
corrwith 两个DataFrame的相关性矩阵(列与列相对应)
count 计算每一行/列上的非空值个数
cov 协方差矩阵
cummax 行(列)前所有数的累计最大值
cummin  行(列)前所有数的累计最小值
cumprod 累乘(从开始到当前值)
cumsum 累加 
describe 一些常用的统计数据 
diff 每行/列与上一行/列的差值
eval 给一个string表达式,对符合条件的列进行运算
kurt 无偏峰度
kurtosis  无偏峰度 
mad 平均绝对离差 
max  最大值
mean  平均值 
median 中值 
min 最小值 
pct_change 元素间的百分比变化 
prod、product 累乘(全部值)
quantile 百分比分位符
rank 计算各个数字的级别(根据标签行/列)
round 四舍五入
sem 无偏标准差
skew 无偏系数
sum 计算每列/行上所有非空值的和
std 样本标准差
var 方差
nunique 不重复值的数量
value_counts 统计各行出现的次数
标签相关、数据筛选
add_prefix 加前缀
add_suffix  加后缀 
align 直接连接两个DataFrame
at_time 筛选时间标签中含有指定时间的行
between_time 筛选时间标签中在特定时间之间的行 
drop 删去指定标签的行/列 
drop_duplicates  删去并返回重复的行 
duplicated 返回boolean Series,标识每行是否与前边的行重复
equals 检测两个DataFrame是否元素相同
filter  筛选名字符合条件(支持正则表达式)的行/列
first 选取最开始的若干天 
head  前若干行数据 
idxmax  筛选每一列最大值所在的行标签 
idxmin 筛选每一列最小值所在的行标签
last 选取最后边的若干天 
reindex 重新设置index,保留已有index的行,填补新index的行
reindex_like 筛选另一个DataFrame中行标签与一个DataFrame中行标签相同的行(如果没有就新建这一行)
rename 重命名标签行或标签列
rename_axis  重命名各个轴
reset_index 重置标签列为0、1、……,原标签列变为新列
sample 随机采样一些行
set_axis  重新设置标签(功能类似rename)
set_index 将已有的列设置为标签列
tail 后若干行数据 
take  提取指定行/列的数据
truncate 截取标签在某个区间内的数据
缺省值处理  
backfill、bfill 等价于fillna的参数method='bfill'的情况
ffill、pad 等价于fillna的参数method='ffill'的情况
dropna 删除缺省值所在的行/列
fillna 用一定方法填充缺省值
interpolate 用插值方法填充缺省值
isna、isnull

检查单元格是否为NaN

返回一个DF,其中所有的NaN会被替换为True,非NaN被替换为False

notna、notnull

检查单元格是否不为NaN

返回一个DF,规则与isna、isnull相反 

replace 把一些数据替换为另一些数据
  变形、排序、转置
droplevel 移除指定的标签列/行
pivot  用指定的行/列作为标签重建DataFrame
reorder_levels 重排列标签等级
sort_values 根据某列的值进行排序
sort_index  根据标签列排序 
nlargest 根据某一列的值降序返回前n行 
nsmallest  根据某一列的值升序返回前n行
stack 用某列作为新的标签列
unstack 将多标签列转化为一个普通的列 
melt 将DataFrame转化为属性:值的两列
explode 将list类型的数据拆开,每个元素都构成额外的一行 
squeeze  降维,单个数据变普通变量,一列数据变Series 
DataFrame.T 转置
DataFrame.transpose 转置 
结合、比较、连接、合并
append 加上额外的一行
assign 加上额外的一列
compare 比较两个DataFrame并展示二者的不同之处
join 拥有同名列的两个DataFrame连接
merge 具有不同名但是类型相同两个列的DataFrame连接
update 用另一个DataFrame中的数据填充该DataFrame中的数据
时间类型相关
asfreq 将时间序列转化为具有固定频率的序列(少变多)
asof 返回指定行之前第一个没有空值的行
shift 前若干行/列下移(右移),以某值填充原值
first_valid_index 第一个非空值行的标签
last_valid_index 最后一个非空值行的标签
resample 重采样时间序列,将多个时间行压缩到一个bin中
to_period 将DatetimeIndex转化为PeriodIndex
to_timestamp 将DatetimeIndex转化为时间戳
Flags
Flags 各种DataFrame隐藏属性设置
作图(前边没有plot.的都是DataFrame的方法)
plot 用标签列作横轴,每一列的值在一个图上画折线图
plot.area 上文折线图下的区域内填充各自的颜色
plot.bar 柱状图
plot.barh 水平柱状图
plot.box 箱型图
plot.density、plot.kde 核密度估计图
plot.hexbin hexagonal bin图
plot.hist 直方图
plot.line 折线图,同plot
plot.pie 饼状图
plot.scatter 散点图
boxplot 箱型图
hist 直方图

3.6、部分函数具体使用

1)set_index

说明

为某个DataFrame设置Index,返回修改后的DataFrame

用法

假设有一个DataFrame df,我们想把它的'Time'列设置为Index

df_new = df.set_index('Time',inplace=False)

需要注意的是,如果参数inplace=False,那么并不是对df本身进行修改,而是返回一个修改后的DataFrame,所以需要用一个额外的变量承接 (如上文df_new

2)applymap

说明

对DataFrame中的所有元素使用某个函数,相当于对list使用map的用法

用法

把df中的所有0值设为Null

df.applymap(lambda x:Null if x==0 else x)

 3)apply

说明

对DataFrame中每行/列的所有元素使用某个函数

用法

df.apply(
    func, axis=0, raw=False, result_type=None,
    args=(), **kwds
)

参数

参数 类型 默认值 说明
func 函数名   应用于每一行/每一列的函数值
axis

0与'index'

1与'columns'

0

0:为每一列应用该函数

1:为每一行应用该函数

raw bool False

决定传入的行与列是Series还是ndarray对象:

False:Series

True:ndarray

result_type {'expand','reduce','broadcast',None} None

只用于axis=1

'expand'结果会被加入到DataFrame的扩展列中

'reduce'单独返回结果列

'broadcast'结果保存为原DataFrame中,相当于用结果列替换原DataFrame中的列

args tuple () 传入func的参数

4)添加一列、一行

assign

说明

添加一列

注意

如果只是执行df.assign,那么只会返回一个结果,不会在原df上起作用。

因此要想把结果覆盖原DF,就要写成:

df=df.assign(...)

用法

df_new = df.assign( 列名1 = Series、Array、List ,
       列名2 = Series、Array、List)

参数中的列名n不需要加引号;Series、Array、List要和df长度一致

例子

假设已经有一个DataFrame df,有个长度与它相等Series S,我们要把S添加到df中,命名为'New_Column'

df_new = df.assign( NewColumn=S )

如果是对已有列进行运算得到的新列,可以用lambda匿名函数和df[列名]的结合,例如:

df.assign(temp_f=lambda x: x['temp_c'] * 9 / 5 + 32,
          temp_k=lambda x: (x['temp_f'] +  459.67) * 5 / 9)

append

说明

添加一行

注意

和assign一样,append的结果不会作用于原DataFrame。

因此要想把结果覆盖原DF,就要写成:

df=df.append(...)

用法

df_new = df.append(other, ignore_index=False, verify_integrity=False, sort=False)

参数

参数

类型

默认值

说明

other

DataFrame、Series、Dict

以上所说类型的List

  追加到最后几行的数据
ignore_index bool False 如果为True,那么新df的index将被重新设置为0,1,...,n-1
verify_integrity bool 如果为True,那么当other与原df的index有重复时会报ValueError
sort bool 对新df按照索引进行重新排序

例子

df = pd.DataFrame([[1, 2], [3, 4]], columns=list('AB'), index=['x', 'y'])
df
   A  B
x  1  2
y  3  4

df2 = pd.DataFrame([[5, 6], [7, 8]], columns=list('AB'), index=['x', 'y'])

df2
   A  B
x  5  6
y  7  8
df.append(df2, ignore_index=True)
   A  B
0  1  2
1  3  4
2  5  6
3  7  8

 如果报错TypeError: Can only append a Series if ignore_index=True or if the Series has a name,则需要加参数ignore_index=True

5)between_time

说明

提取Index位于指定时间段内构成新的DataFrame

注意,Index必须是DateTime类型(如何转化可以看Pandas:从CSV中读取一个含有datetime类型的DataFrame、单项时间数据获取

用法

df.between_time(
    start_time, end_time, include_start=True, 
    include_end=True, axis=None
)

参数

参数

类型

默认值

说明

 start_time datetime.time或str    开始时间
end_time  datetime.time或str    结束时间 
include_start  bool  True 是否包含两端
include_end   bool True
axis  {0或'index',1或'columns'}  0 纵向比较还是横向比较

start_time < end_time时,筛选在此区间内的行;

start_time > end_time时,筛选不在此区间内的行。

返回值

Series、DataFrame

例子

ts
                     A
2018-04-09 00:00:00  1
2018-04-10 00:20:00  2
2018-04-11 00:40:00  3
2018-04-12 01:00:00  4

#筛选在此区间内的行 ts.between_time(
'0:15', '0:45') A 2018-04-10 00:20:00 2 2018-04-11 00:40:00 3
#筛选不在此区间内的行 ts.between_time(
'0:45', '0:15') A 2018-04-09 00:00:00 1 2018-04-12 01:00:00 4

 6)interpolate

说明

用插值的方法填充NaN值。

请注意,对于多重索引(MultiIndex)的DataFrame/Series,只支持用method='linear'的形式。

用法

    df.interpolate(
        method='linear', axis=0, limit=None, inplace=False,
        limit_direction=None, limit_area=None, downcast=None, **kwargs
    )

参数

参数

类型

默认值

说明

method
  • 'linear':线性插值(这是Multiindexs可用的唯一方法);
  • 'time':用于日期数据的插值;
  • 'index'、'values':使用索引值作为待填充值;
  • 'pad':使用存在的值填充空值;
  • 'nearest'、'zero'、'slinear'、'quadratic'、'cubic'、'spline'、

   'barycentric'、'polynomial':最近邻、零值、...;

  • 'krogh'、‘piecewise_polynomial’, ‘spline’, ‘pchip’,

   ‘akima’, ‘cubicspline’:用SciPy中相应的插值方法;

  • 'from_derivatives':scipy.interpolate.BPoly.from_derivatives
'linear' 插值方法
axis {0或'index'、1或'columns'、None} 0 沿着哪个方向插值
limit int   最多填充的连续空值数
inplace bool False 是否替换原值
limit_direction {'forward'、'backward'、'both'}  

对于连续的空值,依照该参数说明的方向进行填充。

  • 如果指定参数'limit':如果插值方法是'pad'或'ffill',那么'limit_direction'必须是'forward';如果插值方法是'backfill'或'bfill',那么'limit_direction'必须是'backwards';
  • 如果未指定参数'limit':如果插值方法是'backfill'或'bfill',那么'limit_direction'默认是'backward';其他情况都是'forward'
limit_area {'None'、'inside'、'outside'}  

如果指定了参数'limit',那么在填充连续的NaN时会有如下限制:

None:无限制;

'inside':只填充被合法值包裹的NaNs;

'outside':只填充未被合法值包裹的NaNs

downcast 'infer'或None   空值填充后的类型为向下转型

 

返回值

Series、DataFrame、None

如果inplace=True,那么返回None,原来的DataFrame中的空值被新值填充;如果inplace=False,那么返回一个填充后的Series、DataFrame

例子

1、什么参数都不写,用默认方式插值(即线性插值法——linear)

s = pd.Series([0, 1, np.nan, 3])
s
0    0.0
1    1.0
2    NaN
3    3.0
dtype: float64
s.interpolate()
0    0.0
1    1.0
2    2.0
3    3.0
dtype: float64

2、padding插值,一次最多填充两个连续的空值

s = pd.Series([np.nan, "single_one", np.nan,
               "fill_two_more", np.nan, np.nan, np.nan,
               4.71, np.nan])
s 0 NaN
1 single_one 2 NaN 3 fill_two_more 4 NaN 5 NaN 6 NaN 7 4.71 8 NaN dtype: object
s.interpolate(method
='pad', limit=2) 0 NaN 1 single_one 2 single_one 3 fill_two_more 4 fill_two_more 5 fill_two_more 6 NaN 7 4.71 8 4.71 dtype: object

3、用'forward'方式插值——空值用它前边的值替换:

df = pd.DataFrame([(0.0, np.nan, -1.0, 1.0),
                   (np.nan, 2.0, np.nan, np.nan),
                   (2.0, 3.0, np.nan, 9.0),
                   (np.nan, 4.0, -4.0, 16.0)],
                  columns=list('abcd'))
df
     a    b    c     d
0  0.0  NaN -1.0   1.0
1  NaN  2.0  NaN   NaN
2  2.0  3.0  NaN   9.0
3  NaN  4.0 -4.0  16.0
df.interpolate(method='linear', limit_direction='forward', axis=0)
     a    b    c     d
0  0.0  NaN -1.0   1.0
1  1.0  2.0 -2.0   5.0
2  2.0  3.0 -3.0   9.0
3  2.0  4.0 -4.0  16.0

4、多项式插值——order指明多项式的次数

df['d'].interpolate(method='polynomial', order=2)
0     1.0
1     4.0
2     9.0
3    16.0
Name: d, dtype: float64

 7)drop

说明

从DataFrame中删除指定的行、列。

用法

df.drop(
    labels=None, axis=0, index=None, columns=None,
    level=None, inplace=False, errors='raise'
)

参数

参数

类型

默认值

说明

labels 单个label或label list   要删除的行/列的名
axis {0或'index',1或'columns'} 0 参数labels指定的是行还是列
index 单个label或label list   删除index指定的行,指定了该参数就可以不指定前两个参数
columns 单个label或label list   删除columns指定的列,指定了该参数就可以不指定前两个参数
level int或level name   用于MultiIndex,说明Index的级别
inplace bool False 是否替换原DataFrame,如果False,那么会生成一个修改后的副本
errors {'ignore','raise'} 'raise' 如果是'ignore',就忽略错误,只删除存在的行/列

 

返回值

DataFrame或None;取决于inplace是否为True

例子

先构造一个DataFrame;

df = pd.DataFrame(np.arange(12).reshape(3, 4),
                  columns=['A', 'B', 'C', 'D'])
df
   A  B   C   D
0  0  1   2   3
1  4  5   6   7
2  8  9  10  11

删除列/columns;

df.drop(['B', 'C'], axis=1)
   A   D
0  0   3
1  4   7
2  8  11
df.drop(columns=['B', 'C'])
   A   D
0  0   3
1  4   7
2  8  11

删除行/index

df.drop(index=[0, 1])
   A  B   C   D
2  8  9  10  11

注意,这里的index=[0,1]指的是删除索引为0,1的行,并非删除第0、1行。

换言之,如果索引变成了"first,second",那么这里的写法就是index=["first","second"]

删除/清空/clear所有行

df.drop(index=df.index,inplace=True)

删除根据条件删除其中的若干行

可以先通过循环,把这些行的行号保存为list,再用df.drop(index=list)

del_list=[]
for i in range(data.shape[0]):
    if data.iloc(i,0)<3:
        del_list.append(data.index[i])
data.drop(index=del_list,inplace=True)

 

 8)head、tail

head(n):前n行
tail(n):后n行

不写n默认为5

9)count与sum

count:统计每列或每行非空值的个数

sum:统计每列或者每行非空值的和

使用count+sum的组合可以实现统计整个DF中非空值的个数:

num=df.count().sum()

补充:

count、sum默认是统计每列非空值,如果要统计每行,需要写成count(1)、sum(1)

10)sort_values

说明

按照某列的值排序

用法

DataFrame.sort_values(by, *, axis=0, ascending=True, inplace=False,
 kind='quicksort', na_position='last', ignore_index=False, key=None)

例子

按照C列进行降序排序

df.sort_values('C',ascending=False,inplace=True)

如果没有inplace=True,那么排序不会作用于原DataFrame

 

11)rename

用途

重命名标签行、标签列

用法

df.rename(columns={'old_name1':'new_name1','old_name2:new_name2'})#分别重命名各列
df.rename(index={'old_name1':'new_name1','old_name2:new_name2'})#分别重命名各行

说明

如果不加参数inplace,则不会作用于原DF

columns、index后必须跟dict类型或者某个可以作用于全部行/列的函数(例如str.lower就是把所有标签小写化)

例子

df = pd.DataFrame({"A": [1, 2, 3], "B": [4, 5, 6]})
df.rename(columns={"A": "a", "B": "c"}) #将A列改名a,B列改名c
a c 0
1 4 1 2 5 2 3 6
df.rename(columns=str.lower)
   a  b
0  1  4
1  2  5
2  3  6

 

posted @ 2021-03-02 20:35  ShineLe  阅读(3286)  评论(0编辑  收藏  举报