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 |
'barycentric'、'polynomial':最近邻、零值、...;
‘akima’, ‘cubicspline’:用SciPy中相应的插值方法;
|
'linear' | 插值方法 |
axis | {0或'index'、1或'columns'、None} | 0 | 沿着哪个方向插值 |
limit | int | 最多填充的连续空值数 | |
inplace | bool | False | 是否替换原值 |
limit_direction | {'forward'、'backward'、'both'} |
对于连续的空值,依照该参数说明的方向进行填充。
|
|
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