一、生成测试数据
import pandas as pd
from faker import Faker
import random
import numpy as np
fake = Faker("zh_CN") # 初始化,可生成中文数据
#设置字段
#index = []
for i in range(1,12):
exec('x'+str(i)+'=[]')
#设置样本
prod_cd = ['W00028','W00021','W00022']
prod_nm = ['微信支付','银联扫码支付','转账']
channel = ['APP','微信','短信']
year = ['2020','2021','2022']
#循环生成数据10行,具体多少行可以根据需求修改
for i in range(10):
date = random.choice(year)+fake.date()[4:]
x1.append('1'+str(fake.random_number(digits=8))) # 随机数字,参数digits设置生成的数字位数
x2.append(fake.name()) #姓名
x3.append(fake.ssn()) # 身份证
x4.append(random.choice('男女'))
x5.append(random.randint(18,25))
x6.append(fake.job())
x7.append(random.randint(0,1000000))
x8.append(random.choice(prod_cd))
x9.append(random.choice(prod_nm))
x10.append(random.choice(channel))
x11.append(date)
#创建数据表
datas = pd.DataFrame({
'user_id':x1,
'name':x2,
'ID_card':x3,
'gender':x4,
'age':x5,
'job':x6,
'salary':x7,
'product_id':x8,
'product':x9,
'channel':x10,
'prt_dt':x11
})
datas
运行效果:
二、删除指定行、列:drop()
语法格式
DataFrame.drop(
self,
labels=None,
axis: Axis = 0,
index=None,
columns=None,
level: Level | None = None,
inplace: bool = False,
errors: str = "raise",
)
# labels:要删除的行列的名字,接收列表参数,列表内有多个参数时表示删除多行或者多列
# axis:要删除的轴,与labels参数配合使用。默认为0,指删除行;axis=1,删除列
# index:直接指定要删除的行
# columns:直接指定要删除的列
# inplace:是否直接在原数据上进行删除操作,默认为False(删除操作不改变原数据),而是返回一个执行删除操作后的新dataframe;inplace=True,直接在原数据上修改。
datas.drop(labels='job',axis=1,inplace=True) #删除列
datas
运行效果:
三、删除指定列:del()
语法格式:
del df[‘列名’]
del datas['channel']
datas
运行效果:
四、判断数据是否缺失
1.判断是否存在缺失数据:isnull()
判断序列元素是否为缺失(返回与序列长度一样的bool值)
datas.isnull()
运行效果:
2.判断值是否不为缺失:notnull()
datas.notnull()
运行效果:
3.判断存在缺失值”列”:.isnull().any()
datas.isnull().any()
运行效果:
4.统计每一列中缺失值的个数:.isnull().sum()
datas.isnull().sum()
运行效果:
五、删除值
1.删除缺失值:dropna()
语法格式:
DataFrame.dropna(
self,
axis: Axis = 0,
how: str = "any",
thresh=None,
subset=None,
inplace: bool = False,
)
# axis:移除行或列,默认为0,即行含有空值移除行
# how:‘all’所有值为空移除,'any’默认值,包含空值移除
# thresh:包含thresh个空值时移除
# subset:axis轴上,指定需要处理的标签名称列表
# inplace:是否替换原始数据,默认False
删除含有NaN值的所有行 (axis=0 默认为0)
datas.dropna()
2. 删除含有NaN值的所有列
datas.dropna(axis=1 )
3. 删除元素都是NaN值的行
设置参数 how="all",只有行一整行数据都是NaN的时候才会删除
datas.dropna(axis=0,how="all")
4. 删除元素都是NaN值的列
datas.dropna(axis=1,how="all")
5. 删除指定列中含有缺失的行
subset参数设置指定列
datas.dropna(subset=["data1"], axis=0)
六、填充值
测试数据
df = pd.DataFrame({'Colum1': ['a', 'b', 'c', 'd', 'd', 'e', 'f', 'g'],
'Colum2': [1, 1, 2, 3, np.NaN, 5, 5, np.NaN]})
1.对缺失值进行填充:fillna()
语法格式:
fillna(
self,
value: object | ArrayLike | None = None,
method: FillnaOptions | None = None,
axis: Axis | None = None,
inplace: bool = False,
limit=None,
downcast=None,
) -> DataFrame | None
# value:用于填充的空值的值。
# method: {‘backfill’, ‘bfill’, ‘pad’, ‘ffill’, None}, default None。定义了填充空值的方法, pad / ffill表示用前面行/列的值,填充当前行/列的空值, backfill / bfill表示用后面行/列的值,填充当前行/列的空值。
# axis:选择轴,默认0(行),axis=1:列
# inplace:是否替换原始数据
# limit:int, default None。如果method被指定,对于连续的空值,这段连续区域,最多填充前 limit 个空值(如果存在多段连续区域,每段最多填充前 limit 个空值)。如果method未被指定, 在该axis下,最多填充前 limit 个空值(不论空值连续区间是否间断)
# downcast:dict, default is None,字典中的项为,为类型向下转换规则。或者为字符串“infer”,此时会在合适的等价类型之间进行向下转换,比如float64 to int64 if possible。
# 用0填充空值
printf(df.fillna(value=0))
运行效果
2.用前一行的值填补空值
设置参数 method='pad' 用前一行的值填补空值
printf(df.fillna(method='pad',axis=0))
运行效果
3.用后一列的值填补空值
设置参数 method='backfill'
printf(df.fillna(method='backfill', axis=1))
运行效果
5.设置填充个数
limit=数字,设置填充个数
printf(df.fillna(method='backfill', axis=0, limit=1))
运行效果
6.用前一个元素填充:ffill()
前向后填充缺失值,用缺失值的前一个元素填充,与fillna()相比没有那么多可选性
语法格式:
ffill(
self: DataFrame,
axis: None | Axis = None,
inplace: bool = False,
limit: None | int = None,
downcast=None,
) -> DataFrame | None
df = pd.DataFrame({'Colum1': ['a', 'b', 'c', 'd', 'd', 'e', 'f', 'g'],
'Colum2': [1, 1, 2, 3, np.NaN, 5, 5, np.NaN]})
print(df )
print(df .ffill())
运行效果
七、用后一个元素填充:bfill()
后向填充缺失值,用缺失值的后一个元素填充
df = pd.DataFrame({'Colum1': ['a', 'b', 'c', 'd', 'd', 'e', 'f', 'g'],
'Colum2': [1, 1, 2, 3, np.NaN, 5, 5, np.NaN]})
print(df )
print(df .bfill())
运行效果
八、判断序列元素是否重复:duplicated()
DataFrame.duplicated(subset=None,keep='first')
subset:列标签,可选, 默认使用所有列,只考虑某些列来识别重复项传入列标签或者列标签的序列
keep:{‘first’,‘last’,False},默认’first’
first:删除第一次出现的重复项。
last:删除重复项,除了最后一次出现。
false:删除所有重复项
df = pd.DataFrame({'Colum1': ['a', 'b', 'c', 'd', 'e', 'f', 'f', 'g'],
'Colum2': [1, 1, 2, 3, np.NaN, 5, 5, np.NaN]})
print(df)
print(df.duplicated())
运行效果
九、删除重复行:drop_duplicates()
DataFrame.drop_duplicates(
self,
subset: Hashable | Sequence[Hashable] | None = None,
keep: Literal["first"] | Literal["last"] | Literal[False] = "first",
inplace: bool = False,
ignore_index: bool = False,
) -> DataFrame | None
参数说明:
subset:列标签,可选, 默认使用所有列,只考虑某些列来识别重复项传入列标签或者列标签的序列
keep:{‘first’,‘last’,False},默认’first’
first:删除第一次出现的重复项。
last:删除重复项,除了最后一次出现。
false:删除所有重复项
inplace:是否替换原数据,默认是False,生成新的对象,可以复制到新的DataFrame
ignore_index:bool,默认为False,如果为True,则生成的轴将标记为0,1,…,n-1。
列:
1.所有列:
df = pd.DataFrame({'Colum1': ['a', 'b', 'c', 'd', 'e', 'f', 'f', 'g'],
'Colum2': [1, 1, 2, 3, np.NaN, 5, 5, np.NaN]})
print(df)
print(df.drop_duplicates())
2.指定列
print(df)
print(df.drop_duplicates('Colum1'))
运行效果:
七、分割值
expand:默认为True
import numpy as np
import pandas as pd
df_yj = {'硬件':['键盘|鼠标|显示屏']}
df_yj = pd.DataFrame(data)
print(df_yj)
print(df_yj['硬件'].str.split('|',expand=True))
运行效果:
八、替换值
语法格式:
replace(
self,
to_replace=None,
value=None,
inplace: bool = False,
limit=None,
regex: bool = False,
method: str = "pad",
)
参数说明:
to_replace: 需要替换的值
value:替换后的值
inplace: 是否在原数据表上更改,默认 inplace=False
limit:向前或向后填充的最大尺寸间隙,用于填充缺失值
regex: 是否模糊查询,用于正则表达式查找,默认 regex=False
method: 填充方式,用于填充缺失值
pad: 向前填充
ffill: 向前填充
bfill: 向后填充
1.单值替换
替换值
df = pd.DataFrame({'Colum1': ['a', 'b', 'c', 'd', 'e', 'f', 'f', 'g'],
'Colum2': [1, 1, 2, 3, np.NaN, 5, 5, np.NaN]})
print(df)
print(df.replace('a','b'))
应用效果
2.多值替换
print(df.replace(['a','c','d'],'b'))
运行效果:
print(df.replace(['b','d'],['a','c']))
运行效果:
3.正则表达式替换
to_replace接收正则语法,设置 regex=True
df = pd.DataFrame({'Colum1': ['aaa', 'ab', 'c', 'd', 'e', 'f', 'f', 'g'],
'Colum2': [1, 1, 2, 3, np.NaN, 5, 5, np.NaN]})
print(df)
print(df.replace('a.?',"A",regex=True))
运行效果: