Travel Tips
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
核心pandas介绍
连接 - 沿轴执行连接操作
pd.concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False,
keys=None, levels=None, names=None, verify_integrity=False,
copy=True)
s1 = pd.Series([1,2,3]) s2 = pd.Series([2,3,4]) s3 = pd.Series([1,2,3],index = ['a','c','h']) s4 = pd.Series([2,3,4],index = ['b','e','d']) print(pd.concat([s1,s2])) print(pd.concat([s3,s4]).sort_index()) print('-----') # 默认axis=0,行+行 print(pd.concat([s3,s4], axis=1)) print('-----') # axis=1,列+列,成为一个Dataframe
s5 = pd.Series([1,2,3],index = ['a','b','c']) s6 = pd.Series([2,3,4],index = ['b','c','d']) print(pd.concat([s5,s6], axis= 1)) print(pd.concat([s5,s6], axis= 1, join='inner')) print(pd.concat([s5,s6], axis= 1, keys=['a','b','d'])) # join:{'inner','outer'},默认为“outer”。如何处理其他轴上的索引。outer为联合和inner为交集。 # join_axes:指定联合的index
sre = pd.concat([s5,s6], keys = ['one','two']) print(sre,type(sre)) print(sre.index) print('-----') # keys:序列,默认值无。使用传递的键作为最外层构建层次索引 sre = pd.concat([s5,s6], axis=1, keys = ['one','two']) print(sre,type(sre)) # axis = 1, 覆盖列名
df1 = pd.DataFrame([[np.nan, 3., 5.], [-4.6, np.nan, np.nan],[np.nan, 7., np.nan]]) df2 = pd.DataFrame([[-42.6, np.nan, -8.2], [-5., 1.6, 4]],index=[1, 2]) print(df1) print(df2) print(df1.combine_first(df2)) print('-----') # 根据index,df1的空值被df2替代 # 如果df2的index多于df1,则更新到df1上,比如index=['a',1] df1.update(df2) print(df1) # update,直接df2覆盖df1,相同index位置
.duplicated / .replace
# 去重 .duplicated s = pd.Series([1,1,1,1,2,2,2,3,4,5,5,5,5]) print(s.duplicated()) print(s[s.duplicated() == False]) print('-----') # 判断是否重复 # 通过布尔判断,得到不重复的值 s_re = s.drop_duplicates() print(s_re) print('-----') # drop.duplicates移除重复 # inplace参数:是否替换原值,默认False df = pd.DataFrame({'key1':['a','a',3,4,5], 'key2':['a','a','b','b','c']}) print(df.duplicated()) print(df['key2'].duplicated()) # Dataframe中使用duplicated
s = pd.Series(list('ascaazsd')) print(s.replace('a', np.nan)) print(s.replace(['a','s'] ,np.nan)) print(s.replace({'a':'hello world!','s':123})) # 可一次性替换一个值或多个值 # 可传入列表或字典
分组统计 - groupby功能
① 根据某些条件将数据拆分成组
② 对每个组独立应用函数
③ 将结果合并到一个数据结构中
Dataframe在行(axis=0)或列(axis=1)上进行分组,将一个函数应用到各个分组并产生一个新值,然后函数执行结果被合并到最终的结果对象中。
df.groupby(by=None, axis=0, level=None, as_index=True, sort=True, group_keys=True, squeeze=False, **kwargs)
df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar','foo', 'bar', 'foo', 'foo'], 'B' : ['one', 'one', 'two', 'three', 'two', 'two', 'one', 'three'], 'C' : np.random.randn(8), 'D' : np.random.randn(8)}) print(df) print('------') print(df.groupby('A'), type(df.groupby('A'))) print('------') # 直接分组得到一个groupby对象,是一个中间数据,没有进行计算 a = df.groupby('A').mean() b = df.groupby(['A','B']).mean() c = df.groupby(['A'])['D'].mean() # 以A分组,算D的平均值 print(a,type(a),'\n',a.columns) print(b,type(b),'\n',b.columns) print(c,type(c)) # 通过分组后的计算,得到一个新的dataframe # 默认axis = 0,以行来分组 # 可单个或多个([])列分组
df = pd.DataFrame({'X' : ['A', 'B', 'A', 'B'], 'Y' : [1, 4, 3, 2]}) print(df) print(df.groupby('X'), type(df.groupby('X'))) print('-----') print(list(df.groupby('X')), '→ 可迭代对象,直接生成list\n') print(list(df.groupby('X'))[0], '→ 以元祖形式显示\n') for n,g in df.groupby('X'): print(n) print(g) print('###') print('-----') # n是组名,g是分组后的Dataframe print(df.groupby(['X']).get_group('A'),'\n') print(df.groupby(['X']).get_group('B'),'\n') print('-----') # .get_group()提取分组后的组 grouped = df.groupby(['X']) print(grouped.groups) print(grouped.groups['A']) # 也可写:df.groupby('X').groups['A'] print('-----') # .groups:将分组后的groups转为dict # 可以字典索引方法来查看groups里的元素 sz = grouped.size() print(sz,type(sz)) print('-----') # .size():查看分组后的长度 df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar','foo', 'bar', 'foo', 'foo'], 'B' : ['one', 'one', 'two', 'three', 'two', 'two', 'one', 'three'], 'C' : np.random.randn(8), 'D' : np.random.randn(8)}) grouped = df.groupby(['A','B']).groups print(df) print(grouped) print(grouped[('foo', 'three')]) # 按照两个列进行分组
df = pd.DataFrame({'data1':np.random.rand(2), 'data2':np.random.rand(2), 'key1':['a','b'], 'key2':['one','two']}) print(df) print(df.dtypes) print('-----') for n,p in df.groupby(df.dtypes, axis=1): print(n) print(p) print('##') # 按照值类型分列
df = pd.DataFrame(np.arange(16).reshape(4,4), columns = ['a','b','c','d']) print(df) print('-----') mapping = {'a':'one','b':'one','c':'two','d':'two','e':'three'} by_column = df.groupby(mapping, axis = 1) print(by_column.sum()) print('-----') # mapping中,a、b列对应的为one,c、d列对应的为two,以字典来分组 s = pd.Series(mapping) print(s,'\n') print(s.groupby(s).count()) # s中,index中a、b对应的为one,c、d对应的为two,以Series来分组
df = pd.DataFrame(np.arange(16).reshape(4,4), columns = ['a','b','c','d'], index = ['abc','bcd','aa','b']) print(df,'\n') print(df.groupby(len).sum()) # 按照字母长度分组
s = pd.Series([1, 2, 3, 10, 20, 30], index = [1, 2, 3, 1, 2, 3]) grouped = s.groupby(level=0) # 唯一索引用.groupby(level=0),将同一个index的分为一组 print(grouped) print(grouped.first(),'→ first:非NaN的第一个值\n') print(grouped.last(),'→ last:非NaN的最后一个值\n') print(grouped.sum(),'→ sum:非NaN的和\n') print(grouped.mean(),'→ mean:非NaN的平均值\n') print(grouped.median(),'→ median:非NaN的算术中位数\n') print(grouped.count(),'→ count:非NaN的值\n') print(grouped.min(),'→ min、max:非NaN的最小值、最大值\n') print(grouped.std(),'→ std,var:非NaN的标准差和方差\n') print(grouped.prod(),'→ prod:非NaN的积\n')
df = pd.DataFrame({'a':[1,1,2,2], 'b':np.random.rand(4), 'c':np.random.rand(4), 'd':np.random.rand(4),}) print(df) print(df.groupby('a').agg(['mean',np.sum])) # 函数写法可以用str,或者np.方法 # 可以通过list,dict传入,当用dict时,key名为columns
# 数据分组转换,transform df = pd.DataFrame({'data1':np.random.rand(5), 'data2':np.random.rand(5), 'key1':list('aabba'), 'key2':['one','two','one','two','one']}) k_mean = df.groupby('key1').mean() print(df) print(k_mean) print(pd.merge(df,k_mean,left_on='key1',right_index=True).add_prefix('mean_')) # .add_prefix('mean_'):添加前缀 print('-----') # 通过分组、合并,得到一个包含均值的Dataframe print(df.groupby('key2').mean()) # 按照key2分组求均值 print(df.groupby('key2').transform(np.mean)) # data1、data2每个位置元素取对应分组列的均值 # 字符串不能进行计算
df = pd.DataFrame({'data1':np.random.rand(5), 'data2':np.random.rand(5), 'key1':list('aabba'), 'key2':['one','two','one','two','one']}) print(df.groupby('key1').apply(lambda x: x.describe())) # apply直接运行其中的函数 # 这里为匿名函数,直接描述分组后的统计量 def f_df1(d,n): return(d.sort_index()[:n]) def f_df2(d,k1): return(d[k1]) print(df.groupby('key1').apply(f_df1,2),'\n') print(df.groupby('key1').apply(f_df2,'data2')) print(type(df.groupby('key1').apply(f_df2,'data2'))) # f_df1函数:返回排序后的前n行数据 # f_df2函数:返回分组后表的k1列,结果为Series,层次化索引 # 直接运行f_df函数 # 参数直接写在后面,也可以为.apply(f_df,n = 2))
类似excel数据透视 - pivot table / crosstab
# 透视表:pivot_table # pd.pivot_table(data, values=None, index=None, columns=None, aggfunc='mean', fill_value=None, margins=False, dropna=True, margins_name='All') date = ['2017-5-1','2017-5-2','2017-5-3']*3 rng = pd.to_datetime(date) df = pd.DataFrame({'date':rng, 'key':list('abcdabcda'), 'values':np.random.rand(9)*10}) print(df) print('-----') print(pd.pivot_table(df, values = 'values', index = 'date', columns = 'key', aggfunc=np.sum)) # 也可以写 aggfunc='sum' print('-----') # data:DataFrame对象 # values:要聚合的列或列的列表 # index:数据透视表的index,从原数据的列中筛选 # columns:数据透视表的columns,从原数据的列中筛选 # aggfunc:用于聚合的函数,默认为numpy.mean,支持numpy计算方法 print(pd.pivot_table(df, values = 'values', index = ['date','key'], aggfunc=len)) print('-----') # 这里就分别以date、key共同做数据透视,值为values:统计不同(date,key)情况下values的平均值 # aggfunc=len(或者count):计数
# 默认情况下,crosstab计算因子的频率表,比如用于str的数据透视分析 # pd.crosstab(index, columns, values=None, rownames=None, colnames=None, aggfunc=None, margins=False, dropna=True, normalize=False) df = pd.DataFrame({'A': [1, 2, 2, 2, 2], 'B': [3, 3, 4, 4, 4], 'C': [1, 1, np.nan, 1, 1]}) print(df) print('-----') print(pd.crosstab(df['A'],df['B'])) print('-----') # 如果crosstab只接收两个Series,它将提供一个频率表。 # 用A的唯一值,统计B唯一值的出现次数 print(pd.crosstab(df['A'],df['B'],normalize=True)) print('-----') # normalize:默认False,将所有值除以值的总和进行归一化 → 为True时候显示百分比 print(pd.crosstab(df['A'],df['B'],values=df['C'],aggfunc=np.sum)) print('-----') # values:可选,根据因子聚合的值数组 # aggfunc:可选,如果未传递values数组,则计算频率表,如果传递数组,则按照指定计算 # 这里相当于以A和B界定分组,计算出每组中第三个系列C的值 print(pd.crosstab(df['A'],df['B'],values=df['C'],aggfunc=np.sum, margins=True)) print('-----') # margins:布尔值,默认值False,添加行/列边距(小计)
核心:read_table, read_csv, read_excel
# 读取普通分隔数据:read_table # 可以读取txt,csv import os os.chdir('/home/zty/Documents/python/Python进阶数据分析及可视化/数据解析核心/CH02数据分析工具:Pandas') data1 = pd.read_table('data1.txt', delimiter=',',header = 0, index_col=1) print(data1) # delimiter:用于拆分的字符,也可以用sep:sep = ',' # header:用做列名的序号,默认为0(第一行) # index_col:指定某列为行索引,否则自动索引0, 1, ..... # read_table主要用于读取简单的数据,txt/csv
# 先熟悉一下excel怎么导出csv data2 = pd.read_csv('餐饮.csv',engine = 'python') print(data2.head()) # engine:使用的分析引擎。可以选择C或者是python。C引擎快但是Python引擎功能更加完备。 # encoding:指定字符集类型,即编码,通常指定为'utf-8' # 大多数情况先将excel导出csv,再读取
data3 = pd.read_excel('地市级党委书记数据库(2000-10).xlsx',sheet_name='中国人民共和国地市级党委书记数据库(2000-10)',header=0) print(data3) # io :文件路径。 # sheetname:返回多表使用sheetname=[0,1],若sheetname=None是返回全表 → ① int/string 返回的是dataframe ②而none和list返回的是dict # header:指定列名行,默认0,即取第一行 # index_col:指定列为索引列,也可以使用u”strings”
Sed ac lorem felis. Ut in odio lorem. Quisque magna dui, maximus ut commodo sed, vestibulum ac nibh. Aenean a tortor in sem tempus auctor
December 4, 2020 at 3:12 pm
Sed ac lorem felis. Ut in odio lorem. Quisque magna dui, maximus ut commodo sed, vestibulum ac nibh. Aenean a tortor in sem tempus auctor
December 4, 2020 at 3:12 pm
Donec in ullamcorper quam. Aenean vel nibh eu magna gravida fermentum. Praesent eget nisi pulvinar, sollicitudin eros vitae, tristique odio.
December 4, 2020 at 3:12 pm
我是 s enim interduante quis metus. Duis porta ornare nulla ut bibendum
Rosie
6 minutes ago