一、数值计算和统计
创新互联公司成立与2013年,先为和平等服务建站,和平等地企业,进行企业商务咨询服务。为和平企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。
1.基本参数axis轴和skipna跳过空值
df.mean() #.mean()默认列计算均值
df.mean(axis=1) #.mean(axis=1)为行计算均值
df.mean(axis=1,skipna=False) #按照行算平均值,直接过滤掉空值和非数值结构;如果想不忽略空值计算,需要skipna参数=False --但是仍然忽略非数值结构
2.计算
df.quantile(q=n) #n分位数 df.std()标准差 df.skew() #样本的偏度 df.kurt()#样本的峰度
3.累计求和/累计求积/累计最大值/累计最小值
df['key1'].cumsum()/.cumprod()/.cummax()/.cummin()
4.保留唯一值:.unique()
5.计数:.value_counts()每个值重复的频率,得到新的Series
s.value_counts(sort=False) #sort参数:对频率排序,默认True
6.成员资格:.isin()类似in 语句,就算只有一个元素也要用[]
s.isin([5]) s.isin([5,13])
二、文本数据
1.通过str访问,且自动忽略丢失/NAN值;不仅适用于值,还适用于列和index
s.str.count('b') #str调用文本数据的方法
df['key2'].str.upper() key2列全部大写
df.columns = df.columns.str.upper() 列名全部大写
2.字符串常用方法:s.str.lower()/s.str.upper()/s.str.len()/s.str.startswith()/s.str.endswith()
3.strip删除空格 lstrip左删除 rstrip右删除:df.columns = df.columns.str.strip()
4.替换:replace(old,new,n替换第几个)
5.分列:split rsplit只用于字符串,适用于Series 和DataFrame
(1)s.str.split(',')[0] #在分列基础上再次选取[]代表选行
(2)s.str.split(',').str[0] #如果想选择值里面的第一列,那就再加个str
s.str.split(',').str.get(1) #与上面的得结果一致,# 可以使用get或[]符号访问拆分列表中的元素
(3)分列后再分多个行:参数expand 默认False不分多行, 参数n最后要拓展几列
s.str.split(',',expand=True,n=1)
6.字符串索引:s.str[0] # 取第一个字符、s.str[:2] # 取前两个字符
三、合并merge、join
1. pd.merge(left,right,on='键',how=’inner‘交集默认/outer/left/right,left_on左面的df以哪列作为键,left_index以左面df的index作为键 ,sort按照键排序)
例:pd.merge(df3,df4,on=['key1','key2'])#多个参考值连接
2. pd.join()-直接通过索引进行连接
(1) .join中suffixes=('_x','_y') 参数:当合并的列明重复时,通过它区分
注:虽然join默认以index为键,但是可以用on改变
四、连接与修补
1..concat([s1,s2],axis=0行=1列,join默认并集=inner交集,join_axes=['a']直指定显示连接后显示的轴)f
(1).concat([])以列表的形式
(2)index参数:是否要根据index进行排序
(3)axis=0默认行+行,axis=1列+列生成df
(4)keys = ['one','two']当axis=0时,keys层次的名称;axis=1时,keys为columns的名称
2.df1.combine_first(df2)#通过index配对后把df2的值修补到df1的NaN上,如果df2的值多于df1会被更新上
#df1.update(df2):df2直接 全部覆盖df1
五、去重及替换:.duplicated/.replace
1..duplicated返回布尔型(True被重复,False没被重复,从上往下依次判断,所以第一个出现肯定不会重复)
2.移除重复.drop_duplicates()inplace默认false,True代替原值
#以上df同样适用
3.替换.replace(通用):注:传入字典,key为old,values为new
六、分组*****
1..groupby(axis=0默认按行(数据)分组=1按列分组;分组后的计算得到新的df;可以单个或多个[]分组)
例:df.groupby('A')返回DataFrameGroupBy,是中间数据
例:df.groupby('A').sum() 返回的是聚合后的数据
df.groupby(['A','B'])可以多行分组 ;df.groupby(['A'])['D'].mean()也可以分组后对某列求聚合函数
2.分组结果是可迭代的对象:
(1) list(df.groupby('X')) #返回[(组名1,df1),(组名2,df2)]#返回list
(2)list(df.groupby('X'))[0]
(3)提取分组 .get_group():df.groupby(['X']).get_group('A') #选择分组后的组A
(4).groups:将分组后的group变成字典dict,key是组名,values是组的index;可以以字典索引方法查看groups里的元素
grouped = df.groupby(['X']), grouped.groups['A']
(5).size()查看分组后的长度 sz = grouped.size()
3.按照数值类型分组:***axis=1按照列进行分组
df.dtypes #返回Series,判断各个值是什么类型
df.groupby(df.dtypes,axis=1).sum() #把Series传入groupby,axis=1按照列进行分组
4.按照字典**:如果特地想把某几列分一组,可以建立字典后分组
mapping = {'a':'one','b':'one','c':'two','d':'two','e':'three'}#ab列对应为one,cd列对应为twe,以字典分组
by_column = df.groupby(mapping,axis=1)
by_column.sum()
5.按照Series分组:axis=1按照列进行分组
6.按照函数分组:df.groupby(len).sum() #按照index的字母长度分组
7.多函数计算:.agg(['',''或np.xx]):
df.groupby('a').agg(['mean',np.sum])
df.groupby('a')['b'].agg({'result1':np.mean,'result2:':np.sum}) #通过dict传入多函数,key为生成结果的columns
七、分组转换拆分-应用-合并:transform、apply
1.数据分组转换transform
(1)方法一、先分组groupby后合并merge等价于transform
(2)方法二、transform会将一个函数应用到各个分组,然后将结果以index全部展现:df.groupby('key2').transform(np.mean)
2.一般化groupby方法:apply--自定义函数,分组后按照该函数运行
df.groupby('key1').apply(f_df1,2) #.apply(函数名,第二个参数)第一个参数默认为apply所执行的
八、数据透视表及交叉表
(1)#透视表 pivot_table(data-df数组,values要聚合的数值,index数透的index,columns透视表的列,aggfunc用于聚合的函数,默认为numpy.mean)
(2)交叉表crosstab 默认情况下,crosstab计算因子的频率表,比如用str的数据透视分析;
#pd.crosstab(Series1,Series2,normalize,values,aggfunc)只接收两个Series,将提供出现的频率表
#参数normalize:默认False将所有值除以值总和进行归一化,=true时显示频率百分比;
#参数values,aggfunc:S1和S2因子聚合后得出values的值并聚合成aggfunc的函数
#参数margins:=True时规格显示的结果并给出行列的总和all
九、数据读取:read_table、read_csv逗号分隔符数据、read_excel
1.读取普通分隔数据::read_table(dfile,delimiter,header=0第0行开始算并为列名,index_col某列开始为索引)可以读取csv和txt
2.读取csv文件***:read_csv(file,engine='python',encoding='utf-8)
3.读取excel文件 read_excel(file,sheetname=[0,1]返回多个sheet/none返回全表--如果是int/string返回的是df,如果是list或None返回的是dict)
给你一段演示代码,参考一下。
import re
text = '''tr张三/tr
tr /tr
tr李四/tr
tr王五/tr'''
text2 = re.findall(r"tr(.+?)/tr", text)
x = 0
for s in text2:
if (text2[x]) != " ": #如果列表内的值为空,不打印。
print(s)
x = x + 1
既然我们认为空值和空格都代表无数据,那么可以先得到这两种情况下的布尔数组。
这里,我们的DataFrame类型的数据集为df,其中有一个变量VIN,那么取得空值和空格的布尔数组为NONE_VIN。然后通过该布尔数组,就能得到我们要的数据了
NONE_VIN = (df["VIN"].isnull()) | (df["VIN"].apply(lambda x: str(x).isspace()))
df_null = df[NONE_VIN]
df_not_null = df[~NONE_VIN]
my_df是一个二维的结构,如下图所示:
stack函数会把列索引转成行索引,即把列索引换成二级的行索引,即所有列压缩到一列。请注意,这个的空值会跳过,下图中的数据结构只有7个元素,7行1列。
a['b','two']
a['d','two']
#上面两个索引是可以的,下面的是会报错KeyError
a['d','one']
unstack函数会把行索引转成列索引,即把行索引换成二级的列索引,即所有行压缩到一行。注:实际上,Python似乎不分行向量或列向量,如果对一个Series对象进行转置,则还是其本身。根据shape函数的返回可知,这是一个8行1列的数据结构。
stack函数会把二级的行索引转成列索引,恢复其二维结构。
我们看到,用过stack函数后可以用unstack函数来恢复其原貌。反过来如何呢?
会报错:AttributeError: 'Series' object has no attribute 'stack'
我们发现,stack和unstack两个函数的组合,如下所示,只有前两个是可以的没有问题的。这是因为一个二维数据经过stack或unstack后,变成了一个Series结构,而Series有unstack没有stack。
my_df.stack().unstack()
my_df.unstack().unstack()
#my_df.stack().stack()
#my_df.unstack().stack()
a=my_df.stack()
print(type(a))
print(dir(a))
如下图所示,用过了unstack后,怎么恢复原状呢?转置一下即可。