数据处理、清洗

本文介绍了使用Pandas进行数据处理和清洗的各种方法,包括快速生成描述性报告、查看变量基本信息、数据分类计数、新增列、删除无用列、分类变量编码、随机抽取、数据归一化、缺失值处理以及异常值处理等。还提供了相关链接以深入理解每个操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

快速生成描述性报告

pandas_profiling需要安装(失败)

import pandas_profiling as pp
pp.ProfileReport(data)
查看变量基本信息
data.describe()
查看数据行列数
train_data.shape , test_data.shape
查看数据个数
ntr = len(train_data)
查看数据分类名称 unique()
data['护理来源'].unique()
数据分类计数 value_counts()
data['out'].value_counts()
新增列并赋值
# 新增因变量列,赋值缺失值,合并前区分数据集
test_data['肝炎'] = 'nan'
获取列名、合并数据集
# 列名列表
dcols = list(train_data.columns)

# 按同一列名合并,重置行标签
d0 = pd.concat([train_data[dcols],test_data[dcols]]).reset_index(drop=True)
删除无用列变量
d0.drop('ID',axis= 1,inplace=True)
分类变量编码
### 硬编码(树形模型适用)
from sklearn.preprocessing import LabelEncoder

x['区域'] = LabelEncoder().fit_transform(x['区域'])

### 哑变量(使用回归时)(自动识别分类变量)
d0 = pd.get_dummies(d0)

### 自己编码
## 对性别进行编码
def gender(x):
    if x=='M':
        return 0
    else:
        return 1
d0['性别']=d0['性别'].apply(gender)
## 对区域进行编码
def district(x):
    if x=='east':
        return 1
    elif x=='south':
        return 2
    elif x=='north':
        return 3
    else:
        return 4
d0['区域']=d0['区域'].apply(district)
## 对护理来源进行编码
def care(x):
    if x=='Governament Hospital':
        return 1
    if x=='Never Counsulted':
        return 2
    if x=='Private Hospital' or x==' ':
        return 3
    if x=='clinic':
        return 4
d0['护理来源']=d0['护理来源'].apply(care)
随机抽取random.sample 、集合的差集set.difference

多用于截取列表的指定长度的随机数,但是不会改变列表本身的排序

list = [0,1,2,3,4]
rs = random.sample(list, 2)
print(rs)
》》》[2, 4]

随机抽取股票代码,构建训练集,测试集的股票id

random.seed(1)  # “1” 确定随机结果
tr_ids = random.sample(list(stock_codes),int(len(stock_codes)*0.7))
te_ids = list(set.difference(set(stock_codes),set(tr_ids)))  # set.difference 集合的差集
数据归一化

0-1之间
https://www.zhangshengrong.com/p/x7XR8lvdaz/

X = (X-X.min())/(X.max()-X.min())

标准化
https://blog.youkuaiyun.com/sinat_26917383/article/details/51228217

# 对数据进行标准化
X = (X - X.mean())/np.std(X)
缺失值的处理

泰坦尼克号例子
https://blog.youkuaiyun.com/weixin_33734785/article/details/94638607

查看所有列缺失值情况:== data.info()==
isnull、notnull:判断缺失值
dropna:删除缺失值
fillna、interpolate:填补缺失值

data.count(axis=0) 统计每列的非空值个数
data.count(axis=1) 统计每行的非空值个数
df.shape[0] - df.count() 缺失值总个数

data = pd.Series([1,2,3,np.nan,np.nan,4,5])

# 判断缺失值
data.isnull()
data.notnull()

# 通过 sum 和 isnull 函数来检测有多少缺失值
sum(data.isnull())
data.isnull().sum()

# 筛选出所有含有缺失值的行
df[df.isna().T.any()]

## 删除缺失值
# 通过 dropna 直接删除缺失值,默认情况下 dropna 会删除任何含有缺失值的行
data.dropna()

# 指定列,删除行数据(2种方法)
train.dropna(subset=['肝炎'], how='all', inplace=True)   

train_data = train_data[train_data['肝炎'].isnull()==False]   

## 填补缺失值
#采用前项填充或者后项填充
data.fillna(method = 'ffill')
data.fillna(method = 'bfill')

# 使用常量填充
data.fillna(100)

# 均值、中位数、众数
data.fillna(data.mean())
data.fillna(data.median())
data['体重'] = data['体重'].fillna(data['体重'].median())
data['教育'] = data['教育'].fillna(data['教育'].mode()[0])
条件填充缺失值
### 1个条件
data['高血压'][data['最高血压']>140]=1
data['高血压'][data['最高血压']<=140]=0

### 2个条件
d0['最高血压'][d0['最高血压'].isnull() & d0['高血压']==1] = 141
d0['最高血压'][d0['最高血压'].isnull() & d0['高血压']==0] = 119
d0['最低血压'][d0['最低血压'].isnull()] = 70

### 3个条件(循环)
for i in range(len(d0)):
# 高血压缺失填补
    if np.isnan(d0.loc[i,'高血压']):
        if d0.loc[i,'最高血压']>=140:
            d0.loc[i,'高血压'] = 1
        else:
            d0.loc[i,'高血压'] = 0  
# 高血压异常调整
    if d0.loc[i,'最高血压'] <140 and d0.loc[i,'高血压'] ==1:
        d0.loc[i,'高血压'] = 0
    if d0.loc[i,'最高血压'] >=140 and d0.loc[i,'高血压'] ==0:
        d0.loc[i,'高血压'] = 1
#  肥胖腰围异常调整    
    if d0.loc[i,'肥胖腰围']==1 and np.isnan(d0.loc[i,'腰围']):
        d0.loc[i,'腰围'] = 110
    if d0.loc[i,'肥胖腰围']==0 and np.isnan(d0.loc[i,'腰围']):
        d0.loc[i,'腰围'] = 90

### 交叉分段填充
# 年龄分段求最高血压均值
d0.describe()
for i in range(len(d0)):
    if d0.loc[i,'年龄']<40 :
        d0.loc[i,'年龄段'] = '20-40'
    if 40<=d0.loc[i,'年龄']<60 :
        d0.loc[i,'年龄段'] = '40-60' 
    if 60<=d0.loc[i,'年龄']<80 :
        d0.loc[i,'年龄段'] = '60-80'
    if d0.loc[i,'年龄']>=80 :
        d0.loc[i,'年龄段'] = '80-100'
d0[['年龄段', '最高血压']].groupby('年龄段',as_index=False).mean()
# 按年龄填充
import numpy as np
for i in range(len(d0)):
    if np.isnan(d0.loc[i,'最高血压']):
        if d0.loc[i,'年龄']<40:
            d0.loc[i,'最高血压'] = 113.517898
        if 40<=d0.loc[i,'年龄']<60:
            d0.loc[i,'最高血压'] = 124.015680
        if 60<=d0.loc[i,'年龄']<80:
            d0.loc[i,'最高血压'] = 138.441622
        if d0.loc[i,'年龄']>=80:
            d0.loc[i,'最高血压'] = 147.539200  
重复数据处理
# 生成数据
data1,data2,data3,data4=['a',3],['b',2],['a',3],['c',2]
df=pd.DataFrame([data1,data2,data3,data4],columns=['col1','col2'])
print(df)

## 判断重复数据
df.duplicated() 

## 删除重复的数据
# 删除所有列值相同的记录
df.drop_duplicates()
# 删除指定列值相同的记录
df.drop_duplicates(['col2'])
异常值处理
data = pd.DataFrame(np.random.randn(1000,4))
data.head()

# 通过describe可以看到最大值有大于3的,最少值有小于负3的,那么这里假设大于3的和小于负3的都属于异常值,需要让它们都分别变成3和-3
data.describe()

# 假设想要找出一列中绝对值大于3的值
data[2][np.abs(data[2])>3]

# 选出所有值大于3或小于3的行
data[(np.abs(data)>3).any(1)]

# 将小于-3的值换成-3,大于3的值换成3
data[np.abs(data) > 3] = np.sign(data) * 3
data.describe()

# np.sign(data)是根据数据中的值的正负分别生成1和-1的数值
np.sign(data).head()
某列根据另一列条件赋值
data['高血压'][data['最高血压']>140]=1
data['高血压'][data['最高血压']<=140]=0
列表里面删除 ‘None’
a = [ '','None', 1,2,3]
a
b =  [str for str in a if str not in [ '', 'None']]
b

[ ’ ‘,’ None’, 1, 2, 3]
[1, 2, 3]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值