python常见统计分析处理函数解读
目录
- 一、分组统计
- 1、分组后对不同指标统计分析
- 2、数据框中多列同时乘以同一列编程客栈值计算
- 二、重要函数(apply、map、filter、query、replace、reduce)
- 1、对数据框下的列进行统计分析:apply+lambda函数
- 2、数据类型转换(float—int):map()函数
- 3、数据筛选filter()函数
- 4、np.where和query
- 5、replace替换(两种:对每个记录修改,记录中数据修改)
- 6、reduce函数
- 三、行/列相关操作
- 1、删除列/行操作
- 2、 查找某列特征数据(字符型)
- 3、列重命名
- 4、包含某个特殊字符的列:contains()
- 5、筛选需要的行业数据:存在isin()/不存在
- 6、根据某几列数据排序sort_values()
- 7、统计gram列每种语言出现的次数
- 8、将空值用上下值的平均值进行填充
- 9、交换两列的位置
- 10、新增一列根据salary将数据分为三组
- 11、将两列合成一列
- 12、拆分某列,生成新的Dataframe
- 13、多列减去一列
- 四、数据框
- 1、对数据框按照分组进行标准化
- 2、数据透视表
- 3、统计指标0和空值数据
- 4、检查数据中是否含有任何缺失值
- 5、数据向前/后移动5天
- 6、按周采样,取一周最大值
- 7、计算前一天与后一天变化率
- 8、将小数转化为百分数
- 9、列表生成式:新增数据列
- 10、新建excel写入数据
- 五、时间数据
- 1、时间范围区间选择:date_range
- 2、将time列时间转换为月-日(月、年月日)
- 忽略警告
- 总结
一、分组统计
1、分组后对不同指标统计分析
df=data.groupby(['city','date']).agg({'tem':np.mean, "tem_max":np.max, "tem_min":np.min}) la=launch.groupby(['user_id','launch_day'],as_index=False).agg({'launch':'sum'})#as_index得到的表格就没有使用group_id作为索引 _funcs = ['mean', 'std', 'sum'] ##遍历每一种统计指标 for _func in _funcs: # 对每一个样本计算各项指标 df[f'P2_C2-C5_{_func}'] = raw[['A10', 'A12', 'A15', 'A17']].agg(_func, axis=1)
2、数据框中多列同时乘以同一列值计算
def calculate_profit(load_price): """计算利润""" # 定义利润计算函数 # 计算各个季节的利润 for season in ['春季', '夏季', '秋季', '冬季']: column_name = f'{season}充放电负荷' profit_column_name = f'{season}利润' load_price[profit_column_name] = load_price.apply(lambda row: row[column_name] * row['电价'], axis=1) return load_price
二、重要函数(apply、map、filter、query、replace、reduce)
1、对数据框下的列进行统计分析:apply+lambda函数
Weekday_Spring_Autumn['weekday_mean']=Weekday_Spring_Autumn.apply(lambda x: x.mean(),axis=1)
2、数据类型转换(float—int):map()函数
map 函数,它接收两个参数,第一个参数是一个函数对象 (当然也可以是一个lambda表达式),第二个参数是一个序列。
map(lambda x: x*2,[1,2,3,4,5]) #输出:[2,4,6,8,10] #可以很清楚地看到,它可以将后面序列中的每一个元素做为参数传入lambda中。
normal.iloc[:,0]=normal.iloc[:,0].map(int) df['time_interval_begin'] = pd.to_datetime(df['time_interval'].map(lambda x: x[1:20])) df_trn['A25'] = df_trn['A25'].replace('1900/3/10 0:00', 70).astype(int)
2.1、删除数据间空格 map+strip
使用strip函数:#删除左右两边空格 df2['Chinese']=df2['Chinese'].map(str.strip) #删除左边空格 df2['Chinese']=df2['Chinese'].map(str.lstrip) #删除右边空格 df2['Chinese']=df2['Chinese'].map(str.rstrip) 有某个特殊的符号,$,我们想把这个删掉 df2['Chinese']=df2['Chinese'].str.strip($S) result_owner.card=result_owner.card.map(lambda x:x.lower()) #身份证字母大写改小写 result_card=result_owner[result_owner['card'].str.len()==18] #删除身份证不是18位,匹配位18位 result_card_new['年龄']=[(2021-int(float(x[6:10]))) for x in result_card_new['card']] #年龄
3、数据筛选filter()函数
flter 函数,和map 函数相似。同样也是接收两个参数,一个lambda 表达式,一个序列。
它会遍历后面序列中每一个元素,并将其做为参数传入lambdjavascripta表达式中,当表达式返回 True,则元素会被保留下来,当表达式返回 False,则元素会被丢弃。
cols_timer = list(filter(lambda x: x.endswith('t'), df_trn_tst.columns))
4、np.where和query
np.where(condition, x, y) #满足条件(condition),输出x,不满足输出y,只有条件 (condition),没有x和y,则输出满足条件 (即非0) 元素的坐标 duration = np.where(duration < 0, duration + 24*60, duration) df_trn.query('收率 > 0.8671')
5、replace替换(两种:对每个记录修改,记录中数据修改)
'''G3i修改为G3''' result_dfa['vehicles']=[result_dfa['vehicles'].iloc[i].replace('G3i','小鹏G3') for i in range(len(result_dfa))] result_dfa['brand']=result_dfa['brand'].replace(['天津一汽丰田','四川一汽丰田(长春丰越)'],'一汽丰田')
6、reduce函数
reduce 函数,也是类似的。它的作用是先对序列中的第 1、2 个元素进行操作,得到的结果再与第三个数据用 lambda 函数运算,将其得到的结果再与第四个元素进行运算,以此类推下去直到后面没有元素了。
reduce(lambda x,y:x+y,[1,2,3,4]) #输出:15
三、行/列相关操作
1、删除列/行操作
year_elect_data=year_elect_data.drop(['ind','年'],axis=1) #删除两列,axis=0行操作 del df_trn['收率'] industry_data_new.drop(industry_data_new.columns[1:3], axis=1, inplace=True) #删除某几列数据 df2=df2.drop(columns=['Chinese']编程客栈) #我们想把“语文”这列删掉 df2=df2.drop(index=["ZhangFei'']) #想把“张飞”这行删掉。 result_vin=result_df.drop_duplicates(subset='vin',keep='first') #删除vin重复数据,保留第一个出现的 '''删除EC60''' result_dfa=result_dfa[~result_dfa['vehicles'].isin(['EC60'])] result_dfa
2、 查找某列特征数据(字符型)
obj_columns=df.select_dtypes(['object']) col=obj_columns.columns df.drop(columns=col,inplace=True) #删除字符串数据
筛选某列数据不为空的数据集:notnull()
ind=df[df.data.notnull()] ind=df[df['data'].notnull()] '''删除EC60''' result_dfa=result_dfa[~result_dfa['vehicles'].isin(['EC60'])] result_dfa
3、列重命名
Year_Elect=Year_elect.rename(columns={"index":"指标名称"}) Year_elect=Year_elect.rename(columns={_col: _col + '_t' for _col in cols_timer},inplace=True) # 批量更改列名 df.rename(columns=lambda x: x + '_1')
4、包含某个特殊字符的列:contains()
Industry_Data.columns.str.contains('_x') #提取含有字符串'hello'的行 #方法一: df[df['ass']=='hello'] #方法二: re=df['ass'].str.contains('hello') df[re]
5、筛选需要的行业数据:存在isin()/不存在
ind_data=ind[ind.行业名称.isin(industry_division.指标名称)] #industry_division.指标名称--industry_division对应指标名称列下的行业 Spring_Autumn_weekend=Spring_Autumn_weekend[~Spring_Autumn_weekend.isin(Statutory_holidays)] #删除法定节假日 #取出满足条件的数据 result_vin_mobile=result_vin[result_vin['mobile'].str.len()==11]#手机号长度为11位
6、根据某几列数据排序sort_values()
dff=One_Weather_hfHgbdata.sort_values(['最高温度','行业'],inplace=True)
7、统计gram列每种语言出现的次数
df['gram'].value_counts()
8、将空值用上下值的平均值进行填充
df['score']=df['score'].fillna(df['score'].interpolate())
9、交换两列的位置
#方式一: temp=df['gram'] df.drop(labels=['gram'],axis=1,inplace=True) df.insert(0,'gram',temp) #方式二: cols=df.columns[[1,0]] df=df[cols]
10、新增一列根据salary将数据分为三组
bins=[0,5000,20000,50000] group_name=['低','中','高'] df['categrories']=pd.cut(df['salary'],bins,labels=group_name)
11、将两列合成一列
df['test']=df['edf']+df['crt'] #两列都是字符型 df['test1']=df['salary'].map(str)+df['crt'] #salary 为int类型
12、拆分某列,生成新的Dataframe
df1 = df['行业'].str.split('-',expand=True) df1.columns = ['编号','行业']
13、多列减去一列
Spring_Air=Spring_Air_Elec-Spring_Air_Reference_Elec.values[:, None] #
四、数据框
1、对数据框按照分组进行标准化
df['data_standardized'] = df.groupby('group')['data'].transform(lambda x: (x - np.mean(x)) / np.std(x)) ##对数据框按照分组,取该组最后一个值 df['data_last'] = df.groupby('group')['data'].transform('last') #对数据框按照分组,对空值进行平均值填充 df['data_filled'] = df.groupby('group')['data'].transjavascriptform(lambda x: x.fillna(x.mean()))
2、数据透视表
#单索引 df_pivot = pd.pivot_table(df,values ='商业销量', index = ['年月'], aggfunc=np.sum, fill_value=0) #当我们未设置aggfunc时,它默认aggfunc='mean'计算均值。fill_value,用0填充空值 #多索引 df_pivot = pd.pivot_table(df,values ='商业销量', index = ['品牌','经销商','年月'], columns=['系列'],aggfunc=np.sum, fill_value=0)#aggfunc可以多参数,如aggfunc=[np.mean,len,np.sum]),aggfunc={'数量':len,'价格':np.sum} #数据透视表过滤 df_pivot = pd.pivot_table(df,values ='商业销量', index = ['品牌','经销商', '年月'], columns=['系列'],aggfunc=np.sum, fill_value=0) df=df_pivot.reset_index() #重置索引 df_pivot.query("品牌==['奔驰','宝马']") #get_level_values来获得不同级别索引 df_pivot.index.get_level_values(0).unique() #各品牌数据 df_pivot.index.get_level_values(1).unique() #各经销商数据 df_pivot.xs(('奔驰','宝马'),level=0) #数据转存excel
3、统计指标0和空值数据
null_per=100*(df.isnull()).sum(axis=0)/len(df) zero_per=100*(df==0).sum(axis=0)/len(df) new=null_per+zero_per
4、检查数据中是否含有任何缺失值
df.isnull().values.any()
5、数据向前/后移动5天
data.shift(-5) data.shift(5)
6、按周采样,取一周最大值
data['收盘价'].resample('W').max()
7、计算前一天与后一天变化率
data['收盘价'].pct_change()
8、将小数转化为百分数
df.style.format({'data':'{0:.2%}'.format})
9、列表生成式:新增数据列
Season_Weekday['Time_label']=[str(i) +'_'+ 'weekday' for i in pd.to_datetime(Season_Weekday.index).month]
#从一个列表中 [ i for i in range(9) if i %2 == 0] #从两个列表中进行推导 [(i,j) for i in range(5) for j in range(5)]
10、新建excel写入数据
write=pd.ExcelWriter(r'各行业重点企业清单\\%s.xlsx'%(hy[0])) jl.to_excel(write,sheet_name='xx') write.save()
五、时间数据
1、时间范围区间选择:date_range
from pandas import date_range Start=pd.to_datetime('%s-04-15'%Year) End=pd.to_datetime('%s-05-15'%Year) Tyday=pd.date_range(start=Start,end=End)
2、将time列时间转换为月-日(月、年月日)
for i in range(len(df)): df.iloc[i,0]=df.iloc[i,0].to_pydatetime().strftime("%m-%d") Weather['Year_Month']=Weather['Date'].map(lambda x: x.to_pydatetime().strftime("%Y-%m")) Industry_Factor_Data["Date"]=pd.to_datetime(Industry_Factor_Data["Date"], format='%Y%m') df['order_date'] = pd.to_datetime(df.order_dt,format="%Y%m%d") df['month'] = df.order_date.values.astype('datetime64[M]')
忽略警告
import warnings warnings.filterwarnings("ignore")
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程客栈(www.devze.com)。
精彩评论