利用pthon进行数据分析-pandas

  • 环境配置
    • 安装pandas、numpy、xlrd
  • 数据的读取
    • 创建文件
    • 读写csv或txt数据
    • 读写mysql数据
    • 读取与修改excel数据
  • -*- coding:utf-8 -*-
  • Pandas数据结构
    • Series
    • DataFrame
    • DateFrame连接
    • 列之间计算
    • 数据清洗
    • 数据替换
    • 分箱操作
    • 字符串操作
    • excel文件拆分合并
    • 分组聚合Groupby
    • 数据处理三板斧
    • Pandas计算差值、同比、环比
    • 时间序列
  • 分享案例

环境配置

安装pandas、numpy、xlrd

1.使用cmd pip install pandas
2.安装xlrd,否则打不开excel文件
3. 使用这个路径下载模块https://pypi.tuna.tsinghua.edu.cn/simple

数据的读取

创建文件

excel文件并写数据,to_csv同理,to_sql则需要连接数据库操作

import pandas as pd
路径=r'D:\pandas测试\张绍林.xlsx'
data1={'num':[1,2,3,4,5],'name':['tom','jerry','geroge','apple','pear'],'age':[12,23,24,25,26]}
data=pd.DataFrame(data1)
data=data.set_index('num')    #重新设置索引,不设置的话会新增一列索引列,从0开始
data.to_excel(路径)
print('success')

读写csv或txt数据

dataframe描述数据集方法

read_csv(方法)()
①sep=‘’ 默认逗号分隔
②header=None/0 列名的行号,默认0第一行,设置为None后为无列名,自增数字为列
③names=[]自定义设置列名,与header=None配合,不一定数量保持一致
④index_col=[]设置索引列,可以是多个,检索df[‘列名’][‘索引名’]实现数据查找
⑤skiprows[]需要跳过行的列表
⑥encoding=‘utf-8’ /‘gbk’编码规则
⑦nrows=3 代表读取前几行
⑧chunksize=1000,代表可以每一千行读取数据,然后分步处理
⑨parse_dates 直接设置为datetime

import pandas as pd
address=r'D:\pandas测试\杭州结果.txt'
data=pd.read_csv(address,sep=',',header=None,names=['a','b','c','d','e','f','h','j'],index_col=['a','b'])
data

读写mysql数据

使用read_sql函数,返回dataframe数据

import MySQLdb
mysql_cn= MySQLdb.connect(host='xxxxx',port=3306,user='root', passwd='123456',db='xxxxxx')
tables= pd.read_sql('show tables;', con=mysql_cn)

读取与修改excel数据

报错第一行增加

-- coding:utf-8 --

read_xlsx()
①sheet_name=1 读取第二个sheet
②header=None/0 列名的行号,默认0第一行,设置为None后为无列名,自增数字为列
③names=[1,2,3,4]自定义设置列名,与header=None配合,不一定数量保持一致
④index_col=0,第一列设置为索引[]设置索引列,可以是多个,检索df[‘列名’][‘索引名’]实现数据查找
⑤usecols = [1,2,3]设定读取第几列
⑥skiprows[]需要跳过行的列表

import pandas as pd
df=pd.read_excel(r'D:\pandas测试\数据码表.xlsx',sheet_name='vehicle',index_col=0,usecols=[1,2,3])

to_excel()
多个sheet写数据,使用for循环

import pandas as pd
from sqlalchemy import create_engine
from sqlalchemy.types import CHAR,INT
import MySQLdb
array = list(tables['Tables_in_gwm_pubdm_gbd'])
writer = pd.ExcelWriter(r'D:\pandas测试\数据码表.xlsx')
for i in array:print(i)j='show  full  columns  from gwm_pubdm_gbd.'+str(i)df_mysql = pd.read_sql(j, con=mysql_cn)df_mysql.to_excel(writer,sheet_name=i)print(df_mysql)
writer.save()
writer.close()

to_sql

to_sql(name='battery_date', con=sql_engine, if_exists='append', index=False)
name为表名,con为链接信息,if_exists为插入方式,replace为替换,append为追加,index为索引是否存在,false

to_csv

empty.to_csv(r'C:\Users\新能源PHEV预警\py_result.csv',index=0,encoding='gbk')
#index=0代表不存储索引

Pandas数据结构

Series

series创建
①列表创建

df=pd.Series([1,2,3,4,5,6,None,None],index=(range(8)))
df1=df.sort_values(ascending=False)
import pandas as pd
a=[1,2,3,4,5]
c=['z','c','d','g','h']
df=pd.Series(a,index=c)

②字典创建

import pandas as pd
df=pd.Series({'a':1,'b':4,'c':6,})
print(df[['a','b']]['a'])   #多个值返回类型为series,单个索引返回值

series方法
①查询,排序

import pandas as pd
df=pd.read_excel(r'D:\pandas测试\数据码表.xlsx',sheet_name='vehicle',index_col=None,usecols=[1,2,3,4])
df
print(df['Type'].values)#取值返回列表
a=data.values[:,2]#取某一列返回列表与上面相等
print(df['Type'].index)#返回索引列表
print(df['Type'].sort_values)#按照值进行排序
df2=df1.sort_values(ascending=False)  #赋新值返回
print(df['Type'].sort_index())#按照索引进行排序正序
print(df['Type'].sort_index(ascending=False))#按照索引进行排序倒序
print(df[['a','b']]['a'])   #多个值返回类型为series,单个索引返回值

②判断空值

df=pd.Series([1,2,3,4,5,6,None,None],index=(range(8)))
df1=df.isnull()
非空值
empty=empty[empty['time'].notnull()]

返回布尔值

DataFrame

jupyter notebook显示所有行列

pd.set_option('max_columns',1000)
pd.set_option('max_row',300)

dataframe的创建
①字典创建

dict={'name':['zsl','ysy','zb','zy'],'age':[20,30,40,50],'gender':['男','女','男','女']}
df=pd.DataFrame(dict)
取数据
print(df[['name','age']])#输出两列的dataframe
print(df.loc[1])  # 输出第二行
print(df.loc[-5:,''] #输出后五行
print(df.loc[0:3][['name','age']]) #前三行,两列
print(df.iloc[0:3][1:3])#前三行,中间两列

②series创建

res=Nowcoder.Level.mode()
print(pd.DataFrame(res,columns=['Level']))

dataframe描述(类型,列名,索引,shape,排序)
df.describe() 对数值进行统计,包含最大最小中值等
df[‘lon’].describe()单列的数据描述
df.info()统计数据类型和非空值数量
df.dtypes

import pandas as pd
import numpy as np
dict={'name':['zsl','ysy','zb',np.nan],'age':[20,np.nan,40,50],'gender':['男','女','男','女']}
df=pd.DataFrame(dict)
#数据的描述
print(df.shape)  #形状行数列数
print(df.columns) #df的列名,返回列表
print(df.index)#df的索引,返回列表
print(df.values)#df的值返回列表嵌套式 [['zsl' 20.0 '男']['ysy' nan '女']['zb' 40.0 '男'][nan 50.0 '女']]
print(df.head(2))#默认为前5行
print(df.tail(2))#默认为后两行
print(df.reset_index(drop=True,inplace=True))#原索引变为列,生成新索引,需要重新赋值,才能生效,drop将索引删除,不设置为数据列
print(df.fillna(1)) #填充空值为1,需要重新赋值
print(df.dropna())  #有空值的直接删除行,需要重新赋值
df=df.sort_index(ascending=False,inplace=True)#按照索引排序,正序、倒序
df.sort_values(by='age',ascending=False,inplace=True)#按照值排序,inplace替换本体
print(df)
#列名的排序
columns=sorted([i for i in data.columns])  #sorted对序列进行排序生成新的list
data=data[columns]  #也可以直接自定义列名,直接写列名
#统计某个字段有多少个值/值个数
print(len(Nowcoder['Language'].unique()))
或print(Nowcoder.Language.nunique())
26
print(Nowcoder['Language'].unique())或
print(Nowcoder.Language.tolist())
['四川省' '广东省' '山东省']
print('\n数据缺失率')
print('{0}%'.format(round(empty.isna().sum() / empty.shape[0] * 100), 2))
#最小值为0的字段
print(df_info.loc['min',:].loc[df_info.loc['min',:]==0])
#返回每个字段是否包含空值,any就是包含一个TRUE就是true,代表一列存在空值,all代表就是全都为空才是true
print(df.isnull().any())
#结果
time_stamp        False
data_args         False
data_avn_speed     True
dt.1              False
hr                False

数据的查询行列、单元格
loc[][]后面第一个行号,可以是值也可以是范围[0:3]第二个是列,可以使列名[[‘name’,‘age’]],也可以是范围[0:3]
iloc只能填写数值,表示序号

dict={'name':['zsl','ysy','zb','zy'],'age':[20,30,40,50],'gender':['男','女','男','女']}
df=pd.DataFrame(dict)
#取数据
print(df[['name','age']])#输出两列的dataframe
print(df.loc[1])  # 输出第二行
print(df.loc[0:3][['name','age']]) #前三行,两列
print(df.loc[0:3,['name','age']])#查询前三行,两列
print(df.iloc[0:3][1:3])#前三行,中间两列
print(df.loc['LGWEF6A70MH253367',:])#代表选取所有列
#print(df.replace(20,'XX'))#值的替换,需要重新赋值
#print(df.describe()) #对所有数字列进行计算均值最大最小值

DateFrame连接

Merge
参数
on:通过哪个字段连接,可以传入列表支持多个字段[‘’,‘’]
left_on/right_on:确定左右表连接的字段,用于字段
left_index/right_index:连接的索引
suffixes:存在重复列名,定义规则(‘’,‘’)
how:连接方式 innner,outer,left,right

import pandas as pd
import numpy as np
df1=pd.DataFrame({'A':['A0','A1','A2','A3'],'B':['B0','B1','B2','B3'],'KEY1':['k0','K0','K1','K1'],'KEY2':['K0','K1','K0','K1']
})
df2=pd.DataFrame({'C':['C0','C1','C2','C3'],'D':['D0','D1','D2','D3'],'KEY1':['k0','K0','K2','K3'],'KEY2':['K0','K1','K0','K1']},index=[['A0','A1','A4','A3']])
print(df2)
print('*'*30)
print(df1)
df=pd.merge(df2,df1,how='left',right_on='A',left_index=True,suffixes=('_start','_end'))

如果使用带索引的df去关联key的df,会报错,原因未知
concat
支持dataframe和series横向纵向连接
objs:需要合并的对象,填充进列表
join:默认为outer,并集,交集是inner
axis:默认为0,代表纵向(按照列名对齐),1代表横向(按照索引对齐)
keys=[‘S1’,‘S2’]设置二级索引,代表数据来自哪个对象,纵向是索引区分,横向是列名区分
ignore_index=True 重置索引

df3=pd.concat([df2,df1],axis=0,keys=['S1','S2'],sort=False)
print(df3)
print(df3['A']['S1'][('A3',)])


两个series合并重新命名

df1=df.iloc[:,1:].sum()  --series
df2=df.iloc[:,1:].count()  --series
df3=pd.concat([df1, df2], axis=1, ignore_index=False)
df3.rename(columns={0:'故障车辆数',1:'总车辆数'},inplace=True)

merge和concat区别
merge默认是横向,匹配的是值
concat默认是纵向,匹配的是字段名和索引
pandas中concat(), append(), merge()的区别和用法

列之间计算

使用apply实现横向axis=1,纵向axis=0默认计算,result_type设置

行计算

df=pd.DataFrame({'Name':['tom','jerry','kevin'],'gender':['men','female','men'],'score':[100,20,30]})
df['level']=df.apply(lambda x:x['score']**2 if x['gender']=='female' else x['score']/5,axis=1)  #横向计算两列,生成新列,进行行计算

多行计算

df[['address','type','POI']]=df.apply(lambda x:get_location(x['data_avn_longitude'],x['data_avn_latitude']),axis=1,result_type="expand")
#重点是result_type参数,expand实现列表转为列

列计算

df1=df.apply(lambda x:np.square(x) if x.name==('score'or'level') else x)#纵向计算单列,识别name符合要求的,进行列计算
print(df1)

如果axis=0代表列计算 lambda x:x.name代表的就是列名
如果axis=1代表行计算lambda x:x.name代表的就是行号(索引)

日期和时间戳转换
字符串类型

df['time']=df['end_time_stamp'].apply(lambda x:int(time.mktime(time.strptime(x,'%Y/%m/%d %H:%M'))))
#2022/1/2 23:44  转换成时间戳
#time.strptime(shijian,"%Y-%m-%d %H:%M:%S")函数根据指定的格式把一个时间字符串解析为时间元组。
#time.mktime() 是将时间元组转为时间戳
#df['time']=df['data_stamp_time'].apply(lambda x :time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(x))) 时间戳转自定义日期

datetime类型
时间戳转日期

1652850237-》2022-05-18 13:03:57
df['time1']=df['data_stamp_time'].apply(lambda x:datetime.datetime.fromtimestamp(x))
#时间戳转日期datetime
df['month']=df['time1'].apply(lambda x :x.month)

字符日期转datetime

字符2022-05-18 13:03:57-》2022-05-18 13:03:57
# df['time1']=df['time'].apply(lambda x :datetime.datetime.strptime(str(x),'%Y-%m-%d %H:%M:%S'))

任意日期字符串转date_time
2022/01/20-》2022-01-20

Nowcoder['Last_submission_time'] = pd.to_datetime(Nowcoder['Last_submission_time'],format='%Y-%m-%d')

Json数据处理

import json
df['data_args1']=df['data_args'].apply(lambda x:(json.loads(x)))#object类型使用json.loads,转换成dict类型
i=(json.loads(y))['end_mode']

数据筛选
loc条件筛选
如果后面罗列列名,可以单独开数据框loc[][‘column1’,‘column2’],也可以写到一个数据框loc[,[‘column1’,‘column2’]]

df.loc[df['duration']>1000,'statues']='###' #前面执行条件判断,后面新增列标签传入参数
等价于df['statues']=df['duration'].apply(lambda x:'###'if x>1000 else '***')

loc条件过滤

df=df.loc[df['duration']<164,['distance','duration']]  #前面通过条件筛选行
print(df.loc[(df['duration']>10 ) & (df['distance']>=60.0),['vin','duration','distance']])#多个条件使用&、|连接,不能缺少括号
df[(df['vin']=='LGWEEEA7641000024') & (df['travel_id']==1)]
#条件过滤,增加筛选条件

行数据筛选
通过行索引名/序号筛选符合条件的列

df_info=df.describe()
print(df_info.loc['min',:].loc[df_info.loc['min',:]==0])
索引名是min
结果如下:
bms_isolation_r_value_rm    0.0
mcu_inv_act_sts             0.0
print(df_info.loc['min'].loc[df_info.loc['min'] == 0])

query方法实现多个条件筛选

#实现空值的筛选,非空值为"vin==vin"
df=df.query("vin!=vin")
m="duration>10 and distance<60"
print(df.query(m))
m="duration in [17,18,19]"
print(df.query(m))

字符串匹配函数contains()

m=df['vin'].str.contains('WEF6A70MH')
print(df[m])#填写要包含的字段,支持正则表达式[a-cA-C]匹配包含小写大写字母的

类似sql in的函数

Nowcoder[Nowcoder['Language'].isin (['CPP','C','C#'])]

日期前后截取函数truncate()
①需要将日期设置为索引
②重新排序
③使用before(前所有行)、after(后所有行)设置前后

df=pd.read_csv(r'D:\pandas测试\杭州结果.txt',sep=',',parse_dates=['start_time_stamp'])
df=df.set_index('start_time_stamp')
df=df.sort_values('start_time_stamp')
df=df.truncate(before='2022-01-12')

多条日期筛选
使用query

df=pd.read_csv(r'D:\pandas测试\杭州结果.txt',sep=',',parse_dates=['start_time_stamp','end_time_stamp'])
#使用parse_dates 将字符串日期转换为datetime
m='@df.start_time_stamp.dt.day==12 @df.start_time_stamp.dt.hour==12'
#自定义条件,可以写多个参数df=df.query(m)
df
datetime日期筛选
empty=empty[empty['tid']>'2022-06-09 23:29:37']

数据清洗

空值删除
drop支持删除行和列,通过axis区分

df.drop(labels=['start_time_stamp','end_time_stamp'],inplace=True,axis=1)#删除列
df.drop(labels=[1,3],inplace=True,axis=0)#删除行
df.dropna(axis=1,how='all',inplace=True)
#axis=0代表删除行,axis=1代表删除列,how代表删除方式any和all,inplace代表替换
df.dropna(axis=0,inplace=True,how='all',subset=['KEY1','KEY2'])
#支持设置筛选的列名,符合条件删除行

空值填充
自定义填充值

df=pd.DataFrame({'A':[1,2,3,5],'B':[500,None,56,None],'KEY1':[123,456,567,None],'KEY2':[22,34,None,None]
})
df.fillna({'A':'*','B':'$','KEY1':'@'},inplace=True)#使用字典对数据进行填充
df[['fl_tire_temp', 'ss_position']] = df[['fl_tire_temp', 'ss_position']].fillna(method='ffill', axis=0)  # 轮胎温度填充

前后填充

df.fillna(axis=0,method='ffill',inplace=True)
#axis代表轴方向,method的方法为ffill从前往后填充、bfill从后往前填充

填充均值

df['2101001'].fillna(df['2101001'].astype('float64').mean(),inplace=True)#自定义填充的数据

数据去重

df['KEY1'].value_counts()#对某列的值进行计数

df.duplicated()
返回是重复行的布尔值,重复为True,不重复为false,可以配置keep为first/last/false,来展示第几行显示True

df.drop_duplicates(inplace=True,subset=['KEY1'],keep='last')
#subset填写需要的字段,keep保留哪行first、last

unique和nunique
eries和DataFrame的两种数据类型中都有nunique()和unique()方法
unique是返回不重复的值
nunique返回不重复值的个数

数据四舍五入

#两种方式
round(df['speed'],3)
df['speed'].round(3)

数据替换

使用replace函数,对于series和dataframe都适用
某个字段部分内容替换

df['导演']=df['导演'].str.replace(r'\n','')

全部替换

print(df.apply(lambda x:x.replace(1,'*',)))#全部替换
df.replace(1,'*',inplace=True)

行替换

print(df.apply(lambda x:x.replace(1,'*') if x.name==3 else x,axis=1)) #横向计算某行,axis为1代表横向,x.name代表行索引

列替换

print(df.apply(lambda x:x.replace(1,'*') if x.name=='KEY2'else x))
df['KEY2'].replace(1,'*',inplace=True)

多个值替换

df['KEY1'].replace([1,123],['*','&'],inplace=True)#多个值的替换,通过传输列表的形式

分箱操作

pd.cut共三个参数
①你需要格式化的列,传入series
②你需要分箱的范围,m
③你需要打的标签

df=pd.DataFrame({'A':[1,2,3,5],'B':[500,None,1,None],'KEY1':[123,323,567,200,],'KEY2':[1,34,1,None]
})
m=[100,200,300,400,600]
label=['小','中','大','超大']
df['statues']=pd.cut(df['KEY1'],m,labels=label)

使用pd.qcut(,q=4)实现等频分箱

数据重命名

can_data.rename(columns={'acquisition_time1':'time_stamp'},inplace=True)

数据模糊匹配

 df = df[df["Creator"].str.contains("79",na=False)]

字符串操作

df[‘’].astype(‘str’)字符串类型的转换

excel文件拆分合并

文件夹多个文件合并,使用os.listdir()函数获取文件名

hebing=pd.DataFrame()
print(hebing)
for name in os.listdir(r'D:\pandas测试\课件025\课件025'):df=pd.read_excel('D:\\pandas测试\\课件025\\课件025\\'+name)print(df)hebing=pd.concat([hebing,df])

多个sheet合并

hebing=pd.DataFrame()
df=pd.read_excel(r'D:\pandas测试\课件025\课件025-3\合并2.xlsx',None)
print(type(df))#返回的是字典,key是sheet名字
list=list(df.keys())
for i in list:data=df[i]#获取字典中key下的值hebing=pd.concat([hebing,data])
hebing.reset_index(inplace=True)
print(hebing)

写到多个sheet中

import pandas as pd
from sqlalchemy import create_engine
from sqlalchemy.types import CHAR,INT
import MySQLdb
array = list(tables['Tables_in_gwm_pubdm_gbd'])
writer = pd.ExcelWriter(r'D:\pandas测试\数据码表.xlsx')#首先创建一个writer对象,传入路径这个参数
for i in array:print(i)j='show  full  columns  from gwm_pubdm_gbd.'+str(i)df_mysql = pd.read_sql(j, con=mysql_cn)df_mysql.to_excel(writer,sheet_name=i)print(df_mysql)
writer.save()    #数据保存
writer.close()   #对象关闭

分组聚合Groupby

聚合方式有:

还有list,类似sql groupby_concat功能
基础知识

for (i,j),group in data.groupby(['',''])print(i)  #分组后行成dataframe,索引为分组字段,是一个元组,字段就是聚合后的结果print(j)print(list(group))

Pandas教程 | 超好用的Groupby用法详解
关于行的聚合,不同列不同方式
引入agg函数,后面添加字典,key为字段名,value为聚合方式

df=pd.read_excel(r'D:\pandas测试\课件026\分组聚合3.xlsx')
print(df)
df=df.groupby(['班级','性别']).agg({'语文':'count','数学':sum})
df_charge = df.groupby(['device_id','travel_num']).agg({'bms_soc_rm_2013022': ['max', 'min','first'],'item_time':['max', 'min']})  # 输出最大和最小值
df_charge.reset_index(inplace=True)
df_charge['soc_diff']=df_charge.apply(lambda x:x[('bms_soc_rm_2013022','max')]-x[('bms_soc_rm_2013022','min')],axis=1)#对于包含二级索引的使用x[('bms_soc_rm_2013022','max')]这种方式选取列

行+列的聚合

df=pd.read_excel(r'D:\pandas测试\课件026\分组聚合3.xlsx')
print(df)
df=df.groupby('班级').agg({'语文':sum,'数学':sum})#按照行计算
m={'语文':'主科','数学':'主科'}#设置列的分组规则
df=df.groupby(m,axis=1)#axis为横向分组
print(df.sum())#进行求和
m=df.groupby('vin')['time_stamp1'].agg(lambda x :list(x))#将分组的结果进行合并成list


不同列对应不同的聚合规则
①apply传入不同的df
②自定义函数返回series
③计算聚合去重vin的数量,绝缘阻值的最小值,去重vin合并(list)

def agg_func(x):'''将每个groupby后的df计算'''return pd.Series({'数量':len(list(x['vin'].unique())),'最小值':x['bms_isolation_r_value_rm'].min(),'vin列举':','.join(x['vin'].unique())})
empty = empty.groupby(['dt', 'label']).apply(agg_func)

行多级索引聚合

不改变行数处理数据
类似于SQL窗口函数

df=pd.read_excel(r'D:\pandas测试\课件026\分组聚合3.xlsx')
print(df)
df['new1']=df.groupby('班级')['语文'].transform('first')
#分组后取语文第一个值,生成新列,所有符合分组索引的都会匹配对应的值

分组取第一行或者最小行

df_min=df.groupby(['vin','trip_id']).apply(lambda x:x[x.time_stamp==x.time_stamp.min()])

取最小行数据

df=df[df.a==df.a.max()]

数据处理三板斧

applymap:对dataframe中的每个单元格执行指定函数的操作

df1=df.applymap(lambda x:x**2)

apply

def change(x,num,num2):x=(x+num)*num2return x
df=pd.read_excel(r'D:\pandas测试\课件026\分组聚合3.xlsx')df.set_index(['班级','性别'],inplace=True)
df['总和']=df['语文'].apply(change,args=(3,4)) #apply可以传入函数,args用来依次传入参数

Pandas计算差值、同比、环比

融合分组函数使用df-df.shift=df.diff
位移函数

df.set_index(['班级','性别'],inplace=True)
df['cha']=df.groupby('班级')['语文'].shift()
#shift(1)和shift(-1)正是向下移,负是向上移

计算差值

df['cha']=df.groupby('班级')['语文'].diff()
#diff(1)代表下减上,diff(-1)代表上减下

计算时间差值

df['diff2']=df.groupby('vin')['time_stamp1'].diff()
#timedelta类型0 days 00:00:07转成秒数,使用total_seconds方法,也可以时间戳减
df['diff2']=df['diff2'].apply(lambda x:x.total_seconds())

时间序列

生成连续精度在一秒的数据,使用date_range方法

import pandas as pd
df=pd.date_range(start='5/01/2022 00:00:00',end='5/30/2022 23:59:59',freq='S',name='timestamp')
df=pd.DataFrame(df)

分享案例

对数据进行分组填充
①自定义函数,分别筛选数据进行填充
②数据的融合

def filltemp(x):'''分组对数据进行填充'''vin=x['vin'].unique()for i in vin:print(i)trip=x[x['vin']==i].hu_travel_id.unique()for j in trip:x[(x['vin']==i)&(x['hu_travel_id']==j)]=x[(x['vin']==i)&(x['hu_travel_id']==j)].fillna(method='ffill')return x
df_all[['vin','hu_travel_id','fl_tire_temp','trip_id','cbn_temp','ss_position','ac_frnt_blwr_spd','start_time','end_time']]=filltemp(df_all.loc[:,('vin','hu_travel_id','fl_tire_temp','trip_id','cbn_temp','ss_position','ac_frnt_blwr_spd','start_time','end_time')])

方法二

def data_fillna(x):x.sort_values(by=['vin','avn_vvid','time_stamp'], inplace=True)x.fillna(method='ffill',inplace=True)print(time.strftime('%H:%M:%S',time.localtime(time.time())))return x
empty=empty.groupby(['vin','avn_vvid']).apply(lambda x:data_fillna(x)).reset_index(drop=True)
#注意需要reset_index否则会报错

众数计算及多个df的merge

df3 = df.groupby(['province', 'vin'])['cbn_temp'].agg(lambda x: stats.mode(x)[0][0]).reset_index()
#计算众数
dfs = [df1, df2, df3]
df_vin = reduce(lambda x, y: pd.merge(x, y, how='inner', on=['vin', 'province']), dfs)
使用reduce不断迭代列表中的df,x+y,结果+z

format用法(读取数据)

a=r'D:\pandas测试\课件025\课件025-3'
for i in os.listdir(a):print('{0}\{1}'.format(a,i,sep='\t'))

数据格式转换
包含’-'值、空值、不同类型

df=df.applymap(lambda x:str(x))
df=df.applymap(lambda x:x.replace('-','0'))
df.fillna(0,inplace=True)
df=df.applymap(lambda x:float(x))
df.iloc[:,1:]=df.iloc[:,1:].applymap(lambda x:x if x==1.0  else 0)

日期处理

data['服务结束时间']=data['服务结束时间'].apply(lambda x :datetime.datetime.strptime(str(x),'%Y-%m-%d %H:%M:%S'))
data['Year'] = data['服务结束时间'].dt.year #取年
data['Month'] = data['服务结束时间'].dt.month #取月
data=data[data['Year']==2023]
data['服务结束时间']=data['服务结束时间'].str[:10]#针对日期格式不统一的进行字符串截取

pandas多进程处理数据

pandas数据分析方法相关推荐

  1. python最快的循环方法_【转】【Python效率】五种Pandas循环方法效率对比

    [Python效率]五种Pandas循环方法效率对比 - 文兄的文章 - 知乎 https://zhuanlan.zhihu.com/p/80880493 正文: 如果你使用过Python及Panda ...

  2. 循环下标_【转】【Python效率】五种Pandas循环方法效率对比

    [Python效率]五种Pandas循环方法效率对比 - 文兄的文章 - 知乎 https://zhuanlan.zhihu.com/p/80880493 正文: 如果你使用过Python及Panda ...

  3. Pandas数据分析groupby函数深度总结(1)

    Pandas数据分析groupby函数深度总结(1) groupby分组数据 加载数据 数据分组 按'Sales Rep'列分组 显示所有分组 选择一个特定的组 计算每组中的行数 按'Sales Re ...

  4. pandas数据分析给力教程【完整版】(七)

    Pandas绘图 上一篇:pandas数据分析给力教程[完整版](六) Series和DataFrame都有一个用于生成各类图表的plot方法.默认情况下,它们所生成的是线形图 线形图 简单的Seri ...

  5. Pandas数据分析案例(盛华化工锅炉排放数据可视化分析)

    Pandas数据分析案例(盛华化工锅炉排放数据可视化分析) 实验环境 数据集介绍 问题描述 实验步骤 一.数据导入与观察 二.数据转换 三.数据可视化分析 相关资源 实验环境 操作系统:Linux/W ...

  6. 【案例教程】Python气象海洋数据可视化到常见数据分析方法(折线图、柱状图、errorbar图、流场矢量、散点图、风玫瑰图、流场矢量、填色及等值线+地图)

    [查看原文]Python在气象与海洋中的实践技术应用 Python是功能强大.免费.开源,实现面向对象的编程语言,能够在不同操作系统和平台使用,简洁的语法和解释性语言使其成为理想的脚本语言.除了标准库 ...

  7. pandas数据分析给力教程【完整版】(五)

    pandas的拼接操作 上一篇:pandas数据分析给力教程[完整版](四) 下一篇:pandas数据分析给力教程[完整版](六) pandas的拼接分为两种: 级联:pd.concat, pd.ap ...

  8. 常用数据分析方法:方差分析及实现!

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:吴忠强,Datawhale优秀学习者,东北大学 一个复杂的事物,其 ...

  9. 数据分析方法——用户群组分析

    文章目录 数据分析方法--用户群组分析 内容摘要 一.群组分析方法介绍 二.项目背景及目的 三.python实操 (1)数据导入 (2)数据处理 (3)用户群组存留率计算 (4)用户群组存留率可视化 ...

最新文章

  1. .Net Reactor 5脱壳教程
  2. 随机选取字母c语言,菜鸟求助,写一个随机输出26个英文字母的程序
  3. 砂石到芯片转变旅程:一千多道工序,数百英里
  4. 测试用例设计方法_测试用例设计方法——流程分析法(场景法)
  5. autofac文档:服务类型,名称和键
  6. Struts2框架学习Action命名空间创建方式
  7. leetCode C++ 二分查找 35. 搜索插入位置 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
  8. pthread_detach函数
  9. 讲述一个自学七年Python编程的码农人生
  10. php的crypt,php使用crypt()函数进行加密
  11. ScrollReveal-元素随页面滚动产生动画的js插件
  12. 点击一下,即可在 Windows 10 实现路过式远程代码执行,未修复
  13. python入门指南-Python完全小白入门指南
  14. 新手如何使用docker搭建web服务环境
  15. poj 1125 Stockbroker Grapevine 代码及分析
  16. 经典中的经典ftp问题,终于解决
  17. 警告!不要购买安桥Htx22hdx直到你读这
  18. SOA面向服务架构详解
  19. 代码整洁之道1-6章总结
  20. 2020中青杯B题股指与国家经济数学建模全过程文档及程序

热门文章

  1. 我发誓一辈子也不坐你的车
  2. 湖北计算机考研排名2015,2015年计算机考研学校排名
  3. 网络基础VlAN配置(eNSP、Cisco)
  4. 关于前端position属性和display属性,这篇文章已足够
  5. teechart Pro Activex control V8摸索
  6. 通用串行总线 2.0 简介
  7. XXL-JOB入门教学
  8. java 分布式 转码_分布式转码集群思路
  9. 4000元左右家庭投影仪推荐,什么牌子投影仪效果最好?
  10. 【热门主题:鬼泣5游戏xp主题】