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
|
|