黑马程序员技术交流社区

标题: 【上海校区】Python Pandas、Spark数据清洗 [打印本页]

作者: wuqiong    时间: 2018-7-12 09:28
标题: 【上海校区】Python Pandas、Spark数据清洗
Pandas数据清洗

        Pandas 是基于 Numpy 构建的含有更高级数据结构和工具的数据分析包。在spark-shell中调用会进一步优化内存,加快处理速度。

NaN值处理

deopna去除处理

#丢弃特征全为NaN的列
df2=df.dropna(axis=1,how='all')
#how="all":只是丢弃全为NaN的行或者列,axis=1列模式

#丢弃特征全为NaN的行
df2=df.dropna(how='all')

#非NaN特征数大于N个行
df2=df.dropna(thresh=N)
如原始df:
          0         1         2
0  0.709057       NaN       NaN
1 -1.483965       NaN       NaN
2 -0.429491       NaN       NaN
3  1.226442       NaN  0.996761
4  0.424773       NaN  2.122809
5  1.083828  0.646571  0.594823
6 -0.870858  0.289760 -0.014352

特征数多余2个的行留下(df2=df.dropna(thresh=2))
          0         1         2
3  1.520194       NaN -0.165655
4  1.165209       NaN -0.736484
5  1.486650  1.023664 -1.058008
6 -1.121736 -1.620619  1.134351
fillna 填充处理

#用平均值填充(各列的平均值)
#inplace 修改调用对象不产生副本
dt.fillna(value=dt.mean(),inplace=True)

          0         1         2
0  0.320676 -0.582089 -0.461967
1  0.526996 -0.582089 -0.461967
2 -1.180447 -0.582089 -0.461967
3  0.690842 -0.582089  0.766019
4 -0.154937 -0.582089 -0.310096
5  0.602846 -0.808745 -0.912055
6  0.352067 -0.355434 -1.391733

#零值充填
dt.fillna(0,inplace=True)
          0         1         2
0 -0.490371  0.000000  0.000000
1 -0.533752  0.000000  0.000000
2 -3.302161  0.000000  0.000000
3  0.313094  0.000000  0.798515
4  0.293058  0.000000  1.442867
5 -1.323815  0.042764 -0.082787
6  1.863899  1.397187 -0.366805
数据去重

df.drop_duplicates(inplace=True)

数据合并

pandas基础

读文件

#读取tab分割的文本(也可以换成任何分割符号,如空格 csv的逗号等等)
#读取中文 utf-8
df=pd.read_table("E:/data/utf/all.txt",\
                encoding="utf-8",\
                sep='\t')
保存文件

df.to_csv("E:/data/utf/raw2_out.csv")#Ascii
df.to_csv("E:/data/utf/all.csv",encoding="utf-8")#处理中文

Python数据简单清洗

数据去重

#字典去重,数据量小才可以,大数据不行,内存和运算速度都不够
dict={}
key=0
for line in fr.readlines():
    if line not in dict.values():
        dict[key]=line
        key+=1
print ("the distinct records = "+str(len(dict)))

去除空行

for line in fr.readlines():
    if len(line)>2:#去除空行和内容特别少的行
        print line
去除换行符

line=line.strip().replace("\r","")
#\r 是windows可能有的换行,在linux显示^M
#strip()可以去掉\n,\r\n,\n\r等,但是过滤不掉单独的\r。     

Spark-SQL数据清洗

dropDuplicates去重

//按features列去重,去掉重复的行(重复的行只保留一行)
Dataset<Row> df3=df2.dropDuplicates("features");

distinct去重

//去重,并且打乱了数据的顺序
Dataset<Row> df2=df.distinct();

数据聚合join

df1.createOrReplaceTempView("df1View");
df2.createOrReplaceTempView("df2View");

String sql="SELECT * FROM df1View JOIN df2View ON df1View.label=df2View.label";
        Dataset<Row> df1_2=spark.sql(sql);

String sql="SELECT * FROM df1View right JOIN df2View ON df1View.label=df2View.label";
        Dataset<Row> df1_2=spark.sql(sql);

String sql="SELECT * FROM df1View left JOIN df2View ON df1View.label=df2View.label";
        Dataset<Row> df1_2=spark.sql(sql);

参考文献:
(1)别老扯什么Hadoop了,你的数据根本不够大
http://geek.csdn.net/news/detail/2780

(2)使用Python Pandas处理亿级数据
http://www.open-open.com/lib/view/open1424831028171.html

(3)在Python中利用Pandas库处理大数据的简单介绍
http://www.thebigdata.cn/JieJueFangAn/13962.html


作者: wuqiong    时间: 2018-7-12 15:34

作者: 吴琼老师    时间: 2018-7-12 16:28





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2