码迷,mamicode.com
首页 > 其他好文 > 详细

pandas的学习总结

时间:2018-01-07 20:18:13      阅读:694      评论:0      收藏:0      [点我收藏+]

标签:join   差值   默认值   imp   value   大小写   new   条件   更新时间   

pandas的学习总结

 

作者:csj
更新时间:2017.12.31

email:59888745@qq.com

说明:因内容较多,会不断更新 xxx学习总结;

1.pandas简介
2.pandas数据结构
  Series
  DataFrame
  Index
  csv文件读写
3.常用函数:
  Group by
  Aggregate
  concat
  merge
  join
  bike project
  stocks project
  credit project

-------------------------------------------------------------------------------------

 1.pandas简介

  pandas是一个专门用于数据分析的python library。
  基于numpy (对ndarray的操作)
  相当于用python做Excel/SQL/R的感觉;
2.pandas数据结构
  2.1Series:
     是一个一维的数据结构;默认用0到n来作为Series的index,但是我们也可以自己指定index。
  index我们可以把它理解为dict里面的key;
  s=pd.Series([1,‘a‘,2,‘b‘,2,20])
  s2=pd.Series([1,‘a‘,2,‘b‘,2,20],index=[1,2,3,4,5)
  s4=pd.Series([{‘a‘:1,‘b‘:2},name=‘price‘])
  print(s)
  s3=s.append(s2)
  Series就像一个dict,前面定义的index就是用来选择数据的;
  Series的元素可以被赋值;s1[0]=3
  数学运算;s1 + s2,s4 /2,s4 **2, r = ‘a‘ in s4
  s4.median()中位数
  s4.mean()
  s4.max()
  s4.min();s4[s4 >s4.mean()]
  数据缺失:
  使用notnull和isnull两个函数来判空:s4.isnull(),s4.notnull()
  为空的部分,赋上平均值:s4[s4.isnull()]=s4.mean()
  选择数据:s[1],s1[2,3,1],s1[1:],s1[:-1],s1.get(‘1‘),s1[s1 <2],s1[s1.index !=2]

    2.2 DataFrame:
  一个Dataframe就是一张表格,Series表示的是一维数组,Dataframe则是一个二维数组;
  columns的名字和顺序可以指定;
  可以从几个Series构建一个DataFrame;
  可以用一个list of dicts来构建DataFrame;
  data ={‘a‘:[1,2,3],‘b‘:[4,5,6]}
  pd1 = pd.DataFrame(data)
  df = pd.DataFrame(data,coulums=[‘t‘,‘f‘],index=[‘one‘,‘tow‘,‘three‘]) #在DataFrame中columns对应的是列,index对应的是行。
  DataFrame元素赋值:
  可以给一整列赋值:df["t"]=400
  给一整行赋值:df["one"]=100
  可以使用loc,iloc选择一行:
  pd1.loc[‘one‘];pd1.iloc[‘one‘];pd1[1:2]
  pd1中加入df:pd1.append(df2);pd1.append(series1)
  pd1中加入一column:pd1[‘newcol‘]=200
  df1["t"].loc["one"] = 300
  df1["colname"]=‘newcolumn‘
  df1.columns
  df1.index
  df1.info
  df.index.name = "city"
  df.columns.name = "info"
  使用isin判断价格在[]范围内的:df1["one"].isin([30, 200])
  df1.where(df1["neo"] > 10)
  对于NAN会被上一个记录的值填充上:df1.fillna(method="ffill") df.ffill()
  df.sub((row, axis=1)) 计算其他的数据与row之间的差值
    2.3Index:
  Series时声明index
  针对index进行索引和切片
  DataFrame进行Indexing与Series基本相同:df.loc[row,colu]
     2.4reindex:
  对一个Series或者DataFrame按照新的index顺序进行重排;
  用drop来删除Series和DataFrame中的index

  2.5csv文件读写:
    read_csv
    to_csv
3.常用函数:
    Group by
    Aggregate
    concat
    merge
    join
    bike project
    stocks project
    credit project

 demo数据清洗:

分析数据问题

  1. 没有列头
  2. 一个列有多个参数
  3. 列数据的单位不统一
  4. 缺失值
  5. 空行
  6. 重复数据
  7. ASCII 字符
  8. 有些列头应该是数据,而不应该是列名参数

1数据清洗 。检查数据 查看一列的一些基本统计信息:data.columnname.describe() •选择一列:data[‘columnname‘] •选择一列的前几行数据:data[‘columnsname‘][:n] •选择多列:data[[‘column1‘,‘column2‘]] •Where 条件过滤:data[data[‘columnname‘] > condition]

。处理缺失数据 。为缺失数据赋值默认值 data.country.fillna(‘‘)#(0,mean) •去掉/删除缺失数据行   data.dropna() data.dropna(how=‘all‘)删除一整行的值都为 NA   data.drop(thresh=5)删除一整行数据中至少要有 5 个非空值 •去掉/删除缺失率高的列

•添加默认值 data.country= data.country.fillna(‘‘)

•删除不完整的行 data.drop(axis=0, how=‘any‘)

•删除不完整的列 删除一正列为 NA 的列:data.drop(axis=1, how=‘all‘,inplace=True)行的例子中使用了 axis=0,因为如果我们不传

参数 axis,默认是axis=0 删除任何包含空值的列:data.drop(axis=1, how=‘any‘,inplace=True)

•规范化数据类型 data = pd.read_csv(‘../data/moive_metadata.csv‘, dtype={‘duration‘: int})

•必要的转换 .错别字 •英文单词时大小写的不统一:data[‘movie_title‘].str.upper() •输入了额外的空格:data[‘movie_title‘].str.strip()

•重命名列名 data = data.rename(columns = {‘title_year’:’release_date’,

‘movie_facebook_likes’:’facebook_likes’})

•保存结果 data.to_csv(‘cleanfile.csv’ encoding=’utf-8’)

demo: df.head() .没有列头 # 增加列头 column_names= [‘id‘, ‘name‘, ‘age‘,

‘weight‘,‘m0006‘,‘m0612‘,‘m1218‘,‘f0006‘,‘f0612‘,‘f1218‘] df = pd.read_csv(‘../data/patient_heart_rate.csv‘, names = column_names)

.一个列有多个参数值,分割成多列 df[[‘first_name‘,‘last_name‘]] = df[‘name‘].str.split(expand=True) df.drop(‘name‘, axis=1, inplace=True)

.列数据的单位不统一 rows_with_lbs = df[‘weight‘].str.contains(‘lbs‘).fillna(False) df[rows_with_lbs] for i,lbs_row in df[rows_with_lbs].iterrows(): weight = int(float(lbs_row[‘weight‘][:-3])/2.2) df.at[i,‘weight‘] = ‘{}kgs‘.format(weight)

.缺失值 data.country.fillna(‘‘) •删:删除数据缺失的记录(数据清洗- Pandas 清洗“脏”数据(一)/[数据清洗]-Pandas 清洗“脏”数据

(一)) •赝品:使用合法的初始值替换,数值类型可以使用 0,字符串可以使用空字符串“” •均值:使用当前列的均值 •高频:使用当前列出现频率最高的数据 •源头优化:如果能够和数据收集团队进行沟通,就共同排查问题,寻找解决方案。

.空行 # 删除全空的行 df.dropna(how=‘all‘,inplace=True) df.dropna(how=‘any‘,inplace=True) .重复数据 # 删除重复数据行 df.drop_duplicates([‘first_name‘,‘last_name‘],inplace=True)

.非 ASCII 字符 处理非 ASCII 数据方式有多种 •删除 •替换 •仅仅提示一下

我们使用删除的方式:

# 删除非 ASCII 字符 df[‘first_name‘].replace({r‘[^\x00-\x7F]+‘:‘‘}, regex=True, inplace=True) df[‘last_name‘].replace({r‘[^\x00-\x7F]+‘:‘‘}, regex=True, inplace=True)

.有些列头应该是数据,而不应该是列名参数,将多列合并为一列 # 删除没有心率的数据 row_with_dashes = df[‘puls_rate‘].str.contains(‘-‘).fillna(False) df.drop(df[row_with_dashes].index, inplace=True)

 

import pandas as pd
# 增加列头
column_names= [id‘, name‘, age‘, weight‘,m0006‘,m0612‘,m1218‘,f0006‘,f0612‘,f1218]
df = pd.read_csv(../data/patient_heart_rate.csv‘, names = column_names)
?
# 切分名字,删除源数据列
df[[first_name‘,last_name‘]] = df[name‘].str.split(expand=True)
df.drop(name‘, axis=1, inplace=True)
?
# 获取 weight 数据列中单位为 lbs 的数据
rows_with_lbs = df[weight‘].str.contains(lbs).fillna(False)
df[rows_with_lbs]
?

#get row data

df[1:5]

#get col data

df[‘columnsname‘]

#get row and col data

df[‘columnsname‘][1:3
# 将 lbs 的数据转换为 kgs 数据
for i,lbs_row in df[rows_with_lbs].iterrows():
weight = int(float(lbs_row[weight‘][:-3])/2.2)
df.at[i,weight‘] = {}kgs.format(weight)

# 删除全空的行
df.dropna(how=all‘,inplace=True)
?
# 删除重复数据行
df.drop_duplicates([first_name‘,last_name‘],inplace=True)
?
# 删除非 ASCII 字符
df[first_name‘].replace({r[^\x00-\x7F]+‘:‘‘}, regex=True, inplace=True)
df[last_name‘].replace({r[^\x00-\x7F]+‘:‘‘}, regex=True, inplace=True)
?
# 切分 sex_hour 列为 sex 列和 hour 列
sorted_columns = [id‘,age‘,weight‘,first_name‘,last_name]
df = pd.melt(df,
id_vars=sorted_columns,var_name=sex_hour‘,value_name=puls_rate).sort_values(sorted_columns)
df[[sex‘,hour‘]] = df[sex_hour‘].apply(lambda x:pd.Series(([x[:1],{}-{}‘.format(x[1:3],x[3:])])))[[0,1]]
df.drop(sex_hour‘, axis=1, inplace=True)
?
# 删除没有心率的数据
row_with_dashes = df[puls_rate‘].str.contains(-).fillna(False)
df.drop(df[row_with_dashes].index,
inplace=True)
?
# 重置索引,不做也没关系,主要是为了看着美观一点
df = df.reset_index(drop=True)
print(df)

pandas的学习总结

标签:join   差值   默认值   imp   value   大小写   new   条件   更新时间   

原文地址:https://www.cnblogs.com/csj007523/p/8158347.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!