python数据清洗方法总结

索引

1.pandas常用方法总结
2.pandas时间序列
3.时间类:datetime
4.字符串相关操作
5.数据分组、统计、连接、透视表
6.可视化


一、pandas常用方法总结

--type() 查看数据类型方法
--dict([("low",0),("medium",1),("high",2)]) 转换成字典
--range(i , j , step ) #i 起始值 ; j 终止值 ;step 步长
--Series
--DataFrame
--df.shape 查看数据维度
--df.info 查看数据表信息
--df.dtypes 查看各列数据表格式
--df.isnull 查看空值
--df.['字段名'].unique() 查看唯一值
--df.values 查看数据表数值
--df.columns 查看列名称
--df.head() 查看前几行
--df.tail() 查看后几行
--df.drop_duplicates(subset =(列名1,列名2...)) 删除重复项
--df.("列名1").value_counts() 按列名值计数
--df.T 转置
--del df['class'] 删除列
--df.drop("",axis = 1) 删除列,不指定axis会默认为0,去删除行,会报错
--df.cumsum() 返回DataFrame或Series轴上的累积和
--df.set_index() 设置索引
--df.reset_index() 恢复索引
--df.describe() 描述表格
--pd.concat(str1,str2) 拼接
--df['TotalCharges'].convert_objects(convert_numeric=True) 强制转换

处理空值(删除或填充)
--a、删除数据表中含有空值的行 df.dropna(how='any')
--b、使用数字0填充数据表中空值 df.fillna(value=0)
使用price均值对NA进行填充 df['price'].fillna(df['price'].mean())

--清理空格 df['city']=df['city'].map(str.strip)
--大小写转换 df['city']=df['city'].str.lower() df['city']=df['city'].str.upper()
--更改数据格式 df['price'].astype('int')
--更改列名称 df.rename(columns={'category': 'category-size'})
--数据替换 df['city'].replace('sh', 'shanghai')

索引操作
--设置索引列 df_inner.set_index('id')
--重设索引 df.reset_index()
--按特定列的值排序 df_inner.sort_values(by=['age'])
--按索引列排序 df_inner.sort_index()

--.loc 操作索引标签(名称)筛选数据 ,与set_index() 一起使用
--df.set_index(keys=['birth_city','birth_state'],append=True,drop = False)
--.sort_index(na_position="last",inplace=True)

--.iloc 按照索引位置筛选数据

二、pandas时间序列

--pandas处理时间序列(4): 移动窗口函数
--pd.rolling_count(df,int)<===>df.rolling(int).count()
--pd.rolling_sum(df,int)<===>df.rolling(int).sum()
--pd.rolling_mean(df,int)<===>df.rolling(int).mean()
--pd.rolling_median(df,int)<===>df.rolling(int).median()
--pd.rolling_var(df,int)<===>df.rolling(int).var()
--pd.rolling_std(df,int)<===>df.rolling(int).std()
--pd.rolling_max(df,int)<===>df.rolling(int).max()
--pd.rolling_min(df,int)<===>df.rolling(int).min()

..............
*降采样:对时间数据细粒度增大,可以把每天的数据聚合成一周,可以求和或者均值的方式进行聚合
--df.resample('7D',closed='right',label='left').sum()/mean()
重采样:降低时间的细粒度,对于重采样,主要是涉及到值的填充。有下面的三种填充方法
不填充。那么对应无值的地方,用NaN代替。对应的方法是asfreq。
用前值填充。用前面的值填充无值的地方。对应的方法是ffill或者pad。
用后值填充。对应的方法是bfill,b代表back。
--df.resample('7H').asfreq()
--df.reasmple('7H').ffill()
--df.reasmple('7H').bfill()

--df.shift(5) 数据往前移动5位
--df.shift(-5) 数据往后移动5位

三、时间类:datetime

--datime模块是专门用于处理时间的类,它是PYTHON的标准库之一,内容复杂且强大,我们只需要学习一个常用的函数即可:
1.--获取时间
--from datetime import datetime
--print(datetime.now())
2.--也可以创建指定的时间
--dt = datetime(2017,8,1)
3.--字符串与时间的转换
--s = '20170901'
--s1 = datetime.strptime(s,'%Y%m%d')
--s = "2019/05/03"
--s2 = datetime.strptime(s,'%Y/%m/%d')
4.-- 时间的提取
--s1.day
--s1.hour
--s1.year
--s1.date()
5.--日期之间的计算需要用到timedelta模块
--from datetime import datetime, timedelta
--s2 - s1
--s2 + timedelta(100)

6.--日期格式设置:
--.dt.strftime('%Y-%m-%d')
7.--提取日期数据:
--.dt.year
--.dt.month
--.dt.day
--.dt.weekday
--.dt.dayofyear
--.dt.days
--.dt.weekofyear
--.dt.date

四、字符串相关操作

字符串分列
--.str.split('-',expand = Ture) #按“-”进行拆分,拆分后分列
--.str.split('-').str.get(1) #按“-”进行拆分,取第2个元素
--.str.split('-',expand = Ture,n = 1) #按“-”进行拆分,拆分后分列,拆分1次
--.str.rsplit('-',expand = Ture,n = 1) #rsplit类似于split,除了它在反向工作,即从字符串的结尾到字符串的开头:

--.str.replace("" , "") #字符串替换 可使用正则表达式
--.str.strip #清除空格

--s.str.lower() 把字符串中字母转化为小写
--s.str.upper() 把字符串中字母转化为大写
--s.str.len() 查看字符串长度
--.str.strip() 清除字符串前、后空格
--.str.lstrip() 清除字符串前空格
--.str.rstrip() 清除字符串后空格
--.str.contains('str') 判断是否包含str
--df.columns 查看列名
--.interpolate() 空值用上下值的平均值
--df['grammer'].map(lambda x: len(x)) 统计grammer列每个字符串的长度

字符串切片
--Series.str.slice(start=None, stop=None, step=None) 把Series按字符串切片进行提取
--start 切片开始选取的位置
--stop 切片结束选取的位置
--step 切片步长

五、数据分组、统计、连接、透视表

分组
1.--df.groupby("director_name")
--类似于SQL里面的group by 语句,不过pandas提供了更加复杂的函数方法
--我们可以对index或者column进行分组,可以被一个元素,也可以是任意多个元素分组。分组后计算的方式否是一样的,无论是基于index还是column。
2.--分箱操作
--等频分箱:pd.qcut(x,q,lables,retbins) 是根据这些值的频率来选择箱子的均匀间隔,即每个箱子中含有的数的数量是相同的
--等距分箱:pd.cut(x,bins,lables,retbins) cut将根据值本身来选择箱子均匀间隔,即每个箱子的间距都是相同的
*参数 说明
--x array,仅能使用一维数组
--bins integer或sequence of scalars,指示划分的组数或指定组距
--labels array或bool,默认为None。当传入数组时,分组的名称由label指示;当传入Flase时,仅显示分组下标
--retbins bool,是否返回bins,默认为False。当传入True时,额外返回bins,即每个边界值。
--precision int,精度,默认为3

3.--条件分组
--如果price列的值>3000,group列显示high,否则显示low
--df_inner['group'] = np.where(df_inner['price'] > 3000,'high','low')
--对复合多个条件的数据进行分组标记
--df_inner.loc[(df_inner['city'] == 'beijing') & (df_inner['price']>= 4000), 'sign']=1

统计计算——探索性数据分析
--df[""].quantile(q=0.25) 四分位数
--df[""].median() 中位数
--df[""].var() 方差
--df[""].std() 标准差
--df[""].mode() 众数
--df[""].skew() 偏态系数,大于0为正偏(向右,平均数大于中位数),小于0为负偏(向左,平均数小于中位数),等于0正态分布
--df[""].kurt() 峰态系数,大于3为厚尾,小于3为窄尾
--df.sample(100) 抽样
--df.dropna(how = "any", axis = 0) 删除异常值

表连接
合并两个表(同Excel中vlookup功能)
--df_inner=pd.merge(df,df1,how=' ') #how参数可取left、right、inner、outer
--pd.merge(left, right, on=['key1', 'key2']) #在多个主键上Join
--pd.merge(left,right,left_on = ['key1','key2'],right_on = ['key3','key4'])
--pd.merge(left,right,left_index=True,right_index=True) #在索引上join

透视表
--pd.pivot_table(df , index = [ 'city' ] , values = [ 'price' ] ,columns = [ 'size' ] ,aggfunc = [len , np.sum ] ,fill_value = 0 ,margin = Ture)

--pd.crosstab(df['director_name'],df['color'],margins=True)
--crosstab 用于计算两个以上的因子的cross-tabulation. 默认的是计算因子之间的频率,除非指定了其它数组或者函数进行计算

六、可视化

%matplotlib inline
import matplotlib.pyplot as plt

1.使用 subplot 绘制多个图形
plt.subplot(nrows, ncols, index, kwargs) #row行 column列 index索引号(从左-右-上-下)
plt.subplot(211) # 等价于 subplot(2,1,1)

2.BAR CHART:条形图
data = [5,25,50,20]
竖向:plt.bar(range(len(data)),data)
plt.barh(range(len(data)),data)

多个bar条形图
data = [[5,25,50,20], [4,23,51,17],[6,22,52,19]]
X = np.arange(4)

plt.bar(X + 0.00, data[0], color = 'b', width = 0.25,label = "A")
plt.bar(X + 0.25, data[1], color = 'g', width = 0.25,label = "B")
plt.bar(X + 0.50, data[2], color = 'r', width = 0.25,label = "C")
plt.legend()

--叠放
plt.bar(X, data[0], color = 'b', width = 0.25)
plt.bar(X, data[1], color = 'g', width = 0.25,bottom = data[0])
plt.bar(X, data[2], color = 'r', width = 0.25,bottom = np.array(data[0]) + np.array(data[1]))
plt.show()

3.SCATTER POINTS:散点图
散点图用来衡量两个连续变量之间的相关性
N = 50;x = np.random.rand(N);y = np.random.rand(N);
plt.scatter(x, y)

--气泡图
colors = np.random.randn(N)
area = np.pi * (15 * np.random.rand(N))
2 # 调整大小
plt.scatter(x, y, c=colors, alpha=0.5, s = area)

4.Histogram:直方图
解释:直方图是用来衡量连续变量的概率分布的。在构建直方图之前,我们需要先定义好bin(值的范围),也就是说我们需要先把连续值划分成不同等份,然后计算每一份里面数据的数量。
a = np.random.rand(100)
plt.hist(a,bins= 40)
plt.ylim(0,15)
plt.title("Standard Normal Distribution")

5.BOXPLOTS:箱型图
--boxlot用于表达连续特征的百分位数分布。统计学上经常被用于检测单变量的异常值,或者用于检查离散特征和连续特征的关系
x = np.random.randint(20,100,size = (30,3))
plt.boxplot(x)
plt.ylim(0,120)
plt.xticks([1,2,3],['A','B','C'])

6.COLORS/TEXTS/annotate
data = [[5,25,50,20],[4,23,51,17],[6,22,52,19]];X = np.arange(4)
plt.bar(X, data[0], color = 'darkorange', width = 0.25,label = 'A')
plt.bar(X, data[1], color = 'steelblue', width = 0.25,bottom = data[0],label = 'B')
plt.bar(X, data[2], color = 'violet', width = 0.25,bottom = np.array(data[0]) + np.array(data[1]),label = 'C')
fig, ax = plt.subplots(facecolor='teal')
ax.set_title("Figure 1")
plt.legend()

--在数据可视化的过程中,图片中的文字经常被用来注释图中的一些特征。使用annotate()方法可以很方便地添加此类注释。在使用annotate时,要考虑两个点的坐标:被注释的地方xy(x, y)和插入文本的地方xytext(x, y)
X = np.linspace(0, 2
np.pi,100)# 均匀的划分数据
Y = np.sin(X);Y1 = np.cos(X)
plt.plot(X,Y);plt.plot(X,Y1)
plt.annotate('Points',xy=(1, np.sin(1)),xytext=(2, 0.5), fontsize=16, arrowprops=dict(arrowstyle="->"))
plt.title("这是一副测试图!")*
--想要让matplotlib正确的显示中文,我们需要进行一行特殊的设置
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号

7.seaborn
import seaborn as sns
import matplotlib.pyplot as plt
sns.set_style(style="darkgrid")#配置样式
sns.set_context(context="poster",font_scale=1.5)#配置字体
sns.set_palette(sns.color_palette("RdBu", n_colors=7))#配置色板
只需要在绘制图形之前调用Seaborn的set()函数就可以直接使用其设定好的默认主题进行美化sns.set();sinplot()
sns.lmplot(x = "",y = "" ,data = ,fit_reg = False ,hue = "") 散点图/回归图
plt.xlim(0,150) 设定x轴范围
plt.ylim(0,200) 设定y轴范围
sns.boxplot(data = , axis = 1) 箱形图
sns.violinplot( x = "",y = "",data = ) 小提琴图
sns.swarmplot(x = 'Type 1',y = 'Attack',data = df) 群集图
sns.distplot(df[""]) 直方图
sns.countplot(x = "" , data = df ,palette = ) 条形图(帮助分类变量的可视化,palette调色板)
plt.xticks(rotation = -45) 设置x标签
g = sns.factorplot(x = 'Type 1',y = 'Attack',data = df ,
hue = 'Stage', --根据不同颜色表示Stage
col = 'Stage', --根据Stage来分离图表
kind = 'swarm') --创建集群图
g.set_xticklabels(rotation = -45) --设置x轴标签 ,factorplot能够根据类别分离图表
sns.kdeplot(df['Attack'],df['Defense']) --密度图显示的是两个变量之间的分布,曲线越密集的地方说明两个变量的关系越近,越稀疏的地方说明关系越远
sns.jointplot(x = 'Attack', y = 'Defense',data = df) 联合分布图将散点图和直方图的信息结合起来,提供双变量分布的详细信息
更多案例:http://seaborn.pydata.org/examples/*

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,634评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,951评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,427评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,770评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,835评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,799评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,768评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,544评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,979评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,271评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,427评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,121评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,756评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,375评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,579评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,410评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,315评论 2 352