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 df3=df2.dropDuplicates("features");

distinct去重

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

数据聚合join

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

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

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

 String sql="SELECT * FROM df1View left JOIN df2View ON df1View.label=df2View.label";
        Dataset 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

你可能感兴趣的:(python,数据库相关)