python常见统计分析处理函数

python常见统计分析处理函数

一、分组统计

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 表达式,一个序列。它会遍历后面序列中每一个元素,并将其做为参数传入lambda表达式中,当表达式返回 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) #删除字符串数据

2.1、筛选某列数据不为空的数据集: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_data.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'].transform(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")
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值