索引
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, 2np.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/*