【python】利用Pandas进行数据预处理

【python】利用Pandas进行数据预处理

 

1.Pandas简介

        Pandas(Python Data Analysis Library )是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。pandas提供了大量能使我们快速便捷地处理数据的函数和方法。你很快就会发现,它是使Python成为强大而高效的数据分析环境的重要因素之一。下面简要介绍一下 Pandas 中的常用的数据结构:

数据结构介绍
Series一维数组,与Numpy中的一维array类似。二者与Python基本的数据结构List也很相近,其区别是:List中的元素可以是不同的数据类型,而Array和Series中则只允许存储相同的数据类型,这样可以更有效的使用内存,提高运算效率。
Time- Series以时间为索引的Series。
DataFrame二维的表格型数据结构。很多功能与R中的data.frame类似。可以将DataFrame理解为Series的容器。以下的内容主要以DataFrame为主。
Panel三维的数组,可以理解为DataFrame的容器。

2.安装pandas

pip install numpy
pip install pandas

3.pandas的一些常用方法

3.1 读取txt文件和csv文件

raw_data = pandas.read_csv(filepath,sep=',',header=None)
参数名介绍
filepath待读取的文件的路径
sep每一行的元素之间的分隔符,默认每个回车代表一行。
header代表文件中是否包括标题名称,None代表不包含。读取的内容将保存到data_frame中(此处是读取二维数据表)。

3.2 去除某些列重复的行

data = raw_data.drop_duplicates(subset=np.linspace(0,27,28),keep='first',inplace=False);
参数名介绍
subset指定根据哪几列进行判断是否重复,可以是列序号的列表,也可以是列名称的列表。删除二维表中前28列重复的行。
inplaceinplace=False表示产生副本data并对data进行操作。inplace=True 表示不产生副本直接对原始数据raw_data进行操作。
keepkeep='first' 表示若含有多个重复的项,则删除除了第一个以外的所有重复行。keep='last' 表示若含有多个重复的项,则删除除了最后一个以外的所有重复行。keep=False 表示若含有多个重复的项,则删除所有重复的行。

3.3 按照某列排序

raw_data.sort_values(by=29 , ascending=False,inplace=True) 
参数名介绍
by指定按照哪一列进行排序(也可以按照列名称指定)。
ascending指定是否为升序排序。
inplaceinplace=True 表示不产生副本直接对原始数据raw_data进行操作。

3.4 将DataFrame数据转换为数组

data = data.values;

3.5 保存数据

data.to_csv(file_path,index=False,sep=',',header=False);
参数名介绍
file_path文件保存的路径。
indexindex=False 表示不保存索引。否则,保存索引序号。
sepsep=',' 表示每一行元素以逗号分隔。
headerheader=False 表示不保存列名称。

 

3.6 数据打乱

        shuffle又叫做洗牌,即将排好序的数据打乱。这里,我们利用sklearn(机器学习的库)中的shuffle方法对DataFrame中的数据行进行洗牌操作 。

from sklearn.utils import shuffle
df = shuffle(df)

3.7 唯一值

data = pandas.Series([1 2 2 3 4 2 4])
data = data.unique()

 3.8 数据计数

data = pandas.Series([1 2 2 3 4 2 4])
data = data.value_counts()

4.实际案例

        在实际环境中,我们常常需要对数据进行处理,下面一个实例演示了如何使用pandas读取文件到DataFrame,以及其他数据处理操作,最终训练出一个神经网络模型,使其能够根据前28列的值来预测第30位的值。

'''
Created on 2019年2月19日

@author: Administrator
'''
from keras.models import Sequential
from keras.layers.core import Dense
# from keras.optimizers import SGD
from keras.optimizers import Adam
from keras.utils import to_categorical
from sklearn.preprocessing import MinMaxScaler
import numpy as np
from keras.layers.core import Dropout 
import os
import pandas as pd

# 读取数据
scaler = MinMaxScaler(feature_range=(0,1)) 
rate = 0.75;

# 原始数据
raw_data_path = os.path.abspath('.') + '\\' + 'DMOPs1_OS.txt'
# 整理后的数据
reduced_data_path = os.path.abspath('.') + '\\' + 'oil_dataset.txt'

# 数据预处理
if not os.path.exists(reduced_data_path):
    # 1.读取原始数据(无标题,以逗号分隔数据)
    raw_data = pd.read_csv(raw_data_path,sep=',',header=None)
    
    # 2.去除重复数据
    raw_data.drop_duplicates(keep='first',inplace=True);# 在DataFrame上删除重复项,而不产生副本
    
    # 3.按照最后一列降序排列
    raw_data.sort_values(by=29 , ascending=False,inplace=True) # by 指定按照第30列(也可以按照列名称指定) ascending 升序
    
    # 4.删除前28列重复的元素
    data = raw_data.drop_duplicates(subset=np.linspace(0,27,28),keep='first',inplace=False);# 删除前28列重复的行,产生副本,并在副本上删除重复项
    
    # 5.保存整理后的数据,方便下次使用
    data.to_csv(reduced_data_path,index=False,sep=',',header=False);# 不保存索引,以逗号分隔,不保存列名称
else:
    data = pd.read_csv(reduced_data_path,sep=',',header=None)

# 将pandas中Dataframe数据转换为二维数组array
data = data.values;

# 数据标准化到0~1区间
train_data = data[0:int(len(data)*rate),0:28]
test_data = data[int(len(data)*rate):,0:28]
train_data = scaler.fit_transform(train_data)
test_data = scaler.fit_transform(test_data)

train_target_pre = data[0:int(len(data)*rate),28:30]
test_target_pre = data[int(len(data)*rate):,28:30]
train_target = []
test_target = []

# 数据处理
for i in range(len(train_target_pre)):
    if train_target_pre[i,0] == 0:
        train_target.append(0)
    else:
        train_target.append(train_target_pre[i,1])#3个塔
for i in range(len(test_target_pre)):
    if test_target_pre[i,0] == 0:
        test_target.append(0)
    else:
        test_target.append(test_target_pre[i,1])

# one-hot编码
train_target = to_categorical(train_target)
test_target = to_categorical(test_target)

# 建立网络
model = Sequential();
model.add(Dense(64,input_dim=28,init='uniform',activation='relu'));
# model.add(Dropout(0.5));#防止过拟合
model.add(Dense(4096,init='uniform',activation='relu'));
model.add(Dense(4096,init='uniform',activation='relu'));
# model.add(Dropout(0.5));
model.add(Dense(64,init='uniform',activation='relu'));
model.add(Dense(4,init='uniform',activation='softmax'));

opter = Adam(lr=0.001,beta_1=0.9,beta_2=0.999,epsilon=1e-8);
# opter = SGD(lr=0.01);
model.compile(loss='categorical_crossentropy',optimizer=opter,metrics=['accuracy']);
model.fit(train_data, train_target, batch_size=32, nb_epoch=100);

loss,accuracy = model.evaluate(test_data, test_target, batch_size=512);
print('loss:',loss,' accuracy:',accuracy);
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值