Pandas数据增删改
1. Pandas 数据的增删改
-
Type
- DataFrame
- Series
-
df['列名'] = 标量或向量
修改或添加列 -
df.insert(列下标数字, 列名, 该列所有值)
指定位置添加列 -
<df/s>.drop([索引值1, 索引值2, ...])
根据索引删除行数据 -
df.drop([列名1, 列名2, ...], axis=1)
根据列名删除列数据 -
<df/s>.drop_duplicates()
df或s对象去除重复的行数据 -
s.unique()
s对象去除重复的数据 -
<df/s>.replace('原数据', '新数据', inplace=True)
替换数据- df或series对象替换数据,返回的还是原来相同类型的对象,不会对原来的df造成修改
- 如果加上inplace=True参数,则会修改原始df
-
apply
函数s.apply(自定义函数名, arg1=xx, ...)
对s对象中的每一个值,都执行自定义函数,且该自定义函数除了固定接收每一个值作为第一参数以外,还可以接收其他自定义参数df.apply(自定义函数名, arg1=xx, ...)
对df对象中的每一列,都执行自定义函数,且该自定义函数除了固定接收列对象作为第一参数以外,还可以接收其他自定义参数df.apply(自定义函数名, arg1=xx, ..., axis=1)
对df对象中的每一行,都执行自定义函数,且该自定义函数除了固定接收行对象作为第一参数以外,还可以接收其他自定义参数
-
applymap
函数df.applymap(自定义函数名)
对df对象中的每个值, 都执行自定义函数, 且该自定义函数只能接收每个值作为参数, 不能接收其他自定义参数
1.1 DateFrame增加行、列
增加行
添加行时 需要使用 df.loc[]
df.iloc[]
不可以用于添加行,报错:数组越界
基础df 没有 loc 和 iloc 好用
# 使用loc[] 直接添加
df.loc[行索引] = ['对应数据','对应数据']
增加列
- 增加方式
- 直接添加
- insert () 函数添加
直接添加
通过 df[列名]=新值
或 df[列名]=series对象/list对象
添加新的一列, 新列添加到df的最后
import pandas as pd
# 导入测试数据
df=pd.read_csv('数据路径',index_col='指定索引列',header=[头索引])
df['新列名'] = ['值']
# 为新列添加固定值
insert()添加
insert()
函数添加 通过 insert(loc=(指定索列位置 int索引),column='新列名',value=['值'])
df.insert(loc=2,column='新列明',value=['值'])
# insert添加列
1.2 删除指定 行、列
使用 drop(labels=[指定索引],axis=(0|1 删除行或列),inplace=(True|False 是否在原数据上更改)函数
- 重要参数
axis = 0 或 1
- 0:删除行
- 1:删除列
# DateFrame 删除指定行
df.drop(labels=[0,5,8], axis=0, inplace=True)
# DateFrame 删除指定列
df.drop(labels=['列名1','列名2'], axis=1, inplace=False)
# Series 删除行。
s.drop([指定索引])
1.3 数据去重
使用函数:
drop_duplicates(subset=['指定列'], keep='first | last', inplace=True | False)
unique | nunique()
DateFrame 数据去重可使用函数:
- drop_duplicates
- nunique
# drop_duplicates() 数据去重
df1.drop_duplicates(subset=['指定列'], keep='first | last', inplace=True | False)
# subset= 指定按照哪些列进行判断数据去重
# keep= 去重后 保留第一条数据 或 最后一条数据
# inplace= 是否改变原值
# nunique() 去重并统计
df1.nunique()
# 先进行去重 完成后按照 列 统计 非重复的数据数量
Series 数据去重可使用函数:
- unique
- nunique
# 展示去重后的值 返回列表
s.unique()
# 展示去重后剩余 值 数量
s.nunique()
1.4 数据修改
- 直接修改
- replace()函数 替换数据
- 自定义函数修改数据
直接修改数据
通过 df[列名]=新值
或 s[行索引]=新值
修改数据
# 直接修改数据
df1.loc[[行索引],'列索引'] = '修改值'
replace()函数替换数据
函数参数:
- to_replace = 需要替换的旧值
- value = 新值
- regex = True | False 是否开启正则匹配
df1.loc[索引位置] = df1.loc[需要和前面一致].replace(to_replace='旧',value='新',regex=True)
#注意:
# 默认replace是完整去匹配替换的,要求整个单词必须完全一致;
# regex=True以后,正则匹配替换
自定义函数修改数据
关键函数:<s/df>.apply(函数名)
参数:
- func 自定义函数 apply() 会读取数据作为参数传入自定义函数中 传参形式根据数据类型不同 axis不同 而不同
- args 更多参数
- axis 针对每行 或 每列数据 执行自定义函数
1.2 中提到 axis = 0 是指定删除行 1 是指定删除列
在 自定义函数 当中 0是修改某列数据 1是修改某行数据 和前面是反过来的
或者按照传入参数是什么数据来理解:
如果axis = 0 传入的是 以列为索引的 行数据
如果axis = 1 传入的是 以行为索引的 列数据
有时需要我们对df或s对象中的数据做更加精细化的修改动作,并将修改操作封装成为一个自定义的函数;这时我们就可以利用
<s/df>.apply(函数名)
来调用我们自定义的函数s或df对象可以借助apply函数执行自定义函数, 内置函数无法处理需求时就需要使用自定义函数来处理
修改Series对象
# s执行 自定义函数 带参数
# 当对象是 Series 时,apply传入的是 Series对象的所有值
def func(x, arg1, arg2):
'''
当接收到的值 与目标值 相等时 改成 arg1
否则 更改成 arg2
'''
if x == '原值':
return arg1
return arg2
s = s.apply(func,args=('希望修改的值','更多'))
修改DateFrame对象
# d执行 自定义函数
# 当对象是 DateFrame 时 且 参数axis=0
# apply 传入的是 以列为 索引的每行数据,修改的是 这一列 所有行的数据
# 当axis = 0
# 让 '列名' 这一列的所有数据 +arg1
def func(s,arg1):
'''
接收 apply 传入的数据 使用 s._name 判断当前 列
如果 列名 符合 则 使用 原数据s + 传入数据arg1
否则 保持原数据s不变
'''
if s._name == '列名':
return s + arg1
return s
df.apply(func,args=(0.8,),axis=0)
# 当axis = 1
# 让 '行值' 为 True 时,改变这一行 其他列的数据
def func(s,args1,args2):
if s['列名'] == '行值':
return s['其他列'] + args1
return s['其他列'] - args2
df['列名'] = df.apply(func,args=(1000,500),axis=1)
applymap()函数 自定义函数遍历每一个值
将DateFrame 或 Series对象 中每一个值传入自定义函数
def func(x):
# 此时x参数就是df中的每个数据
# print('x的值是->', x)
# 本自定义函数也必须返回一个数据
if x == '原值':
return '新值'
return x
df.applymap(func)