【python】datafrme常用数据处理操作

针对datafrme主要操作公式梳理~为了方便阅读,这里的datafrme都赋值为a1,a2这样的形式;

这里对透视举个案例~

 整体命令表格如下~

读取类

处理案例
批量表格抓取path=r'输入'
files = pd.DataFrame()
filenames = os.listdir(path)
for i in filenames:
        excel_path = path +'\\'+ i
        data = pd.read_excel(excel_path)
        files=files.append([data])
files

查看类

功能代码
查看列list(df)
df.columns
查看列数据类型df.dtypes
查看行列大小df.shape
df.size
查看行数len(df)
查看前后几行df.head()
df.tail()
查看指定列结果

df['成绩'].max()
df['成绩'].sum()

df['成绩'].mean()

获取列去重值set(df['成绩'])
生成空df

df = pd.DataFrame()

功能类

表格处理案例
保留正确的

案例:

df3=df2[df2['学生']=='李明']
df4=df3[df3['日期']>='2021-06-01']
df5=df4[df4['日期']<'2021-07-01']

df[(df["成绩"]>100)|(df["成绩"]<0)]#|为或,&条件为和

筛选空值

案例:

a2 = test[test[['生日']].isnull().T.any()] #只选择【生日】列有空值的所有行

筛选指定文本

案例:

data1=df[df['标题'].str.contains('摘要')]

data1=df[ df['通信名称'].str.contains('联通|移动|小灵通|电信')]

data1=df[~df['标题'].str.contains('摘要')]

注:特殊字符,如+,需要写成[+]

去除不对的

案例1:a2=a1[(a1.成绩!=0)]
案例2:a2=a1[(a1.学校!='A')&(a1.学院!='D')&(a1.专业!='G')]

保留要的列

# a3有“时间1”、“时间2”、“时间3”、“时间4”

a3[['时间1','时间2']]

列合并

案例:a1['学校学院'] = a1['学校'].map(str) + a1['学院'].map(str)

增加1列

案例1:a1.insert(0,'数量',1)
案例2:a1.insert(5,'状态','此人已毕业')

案例3:df["年龄"]=1

增加1行

案例1:a1.loc[0]=list(a1) 

案例2:df.loc[5]=[1,2,6]

改列名字

案例:a1.columns=['专业','学号']

单列改名字

案例:a1.rename(columns={'原列名':'新列名'}, inplace=True)

表纵向叠加(1列1样)

案例:a4=a1.append([a2,a3])

表横向加1列,vlookup

案例:a3=pd.merge(a1,a2.loc[:,['学号','姓名']],how='left',on='学号')

案例:a3=pd.merge(a1,a2.loc[:,['学号','学校','姓名']],how='left',on=['学号','学校'])

整体去重

案例:a2=a1.drop_duplicates(keep=False)    #重复文本去重  'first' 、 'last'、'False',保留第1个,保留最后1个,不保留

a2=a1.drop_duplicates(['某一列','某一列'],keep=False)#默认不写列,就是全表去重

单列去空值

案例:a2=a1.dropna(subset=['姓名'])

空值替换为数值

案例:df2 = data.fillna(0)

案例:df5 = data.fillna(data.mean())#平均值填充

数据透视(透视表)

案例:a2=pd.pivot_table(a1,index=[u'学校',u'学院'],columns=[u'专业'],values=[u'成绩'],aggfunc=[min,max,np.mean],fill_value=0,margins=False)#行+列透视,np.sum为求和,'mean'为平均数,margins 是否显示合计

数据透视(分析表)

案例

a2=k.groupby(['课室'])
a2.agg([sum,np.mean,np.std])

添加逻辑列

案例:a2=a1.eval('新列名=列1-列2')#可实现数字简单运算

排序

案例:a1.sort_values(by='比例',ascending=False)#False 降序

案例:a1.sort_values(by=['比例','成绩'],ascending=[False,True])#False 降序

组内排序

c6['排名'] =c6.groupby(['ID'])['TIME'].rank(ascending=False,method='first')

#True 从小到大,method,'average'平均,'min'一样的最小,'max'一样的最大,'first'一样的按照原始顺序,'dense',相同的就算1次,按照1,2,3,4,这样排序

空值填充

案例:a2=a1.fillna(method='ffill',axis=0)   #fillna和ffill 向下填充

#空值变0

a6['近焦POS']=a6['近焦POS'].fillna(0)

列分列

案例:
a2=a1['列名'].str.split(':', expand=True)  #分列命令,按照:分列
pd.concat([a1, a2], axis=1) #返回原来位置

转置

案例:a2 = pd.DataFrame(a1.values.T, index=a1.columns, columns=a1.index)

内容替换案例:a2= a1.replace(0,"666")
替换为空值:a2= a1.replace(0,np.nan)
列求和

案例:a1.loc['合计'] = a1.apply(lambda x: x.sum())

行求和

案例:a1['Col_sum'] = a1.apply(lambda x: x.sum(), axis=1)

删除列

案例:a1.drop(columns=['列名1','列名2'], inplace=False)

保留列案例:a2=a1[['列名1','列名2']]
获取datafrme列名,变为列表

案例:a2=a1.columns.values.tolist()

保留前几行

案例:a2=a1.head(2)

单列求和赋值

案例:a2=a1['数量'].sum()

修改列类型

案例:a4['工号']= a4['工号'].astype('int64')

案例:a9['时']=a9['时'].astype(float)

修改索引(可多个)

案例:

d2=d1.set_index(['姓名','学号'])

a2.set_index("姓名",append=False,drop=False)#不删除原索引

索引重新编号

案例:

a3=a1.reset_index(drop=True, inplace=True)

a3=a2.reset_index(drop=False)#默认不删除原索引

获取datadataframe单值

案例:a2=a1.at[2, '比例']#比例列,第3个,编号0,1,2

手写dataframe

案例:df =pd.DataFrame({"贵阳":[101,102,103],"杭州":[201,202,203],"广州":[301,302,303]})

list合成dataframe

案例:

k1=k['2021-08-16']
k2=k['2021-08-17']
k3={'时间1':k1,'时间2':k2}
from pandas.core.frame import DataFrame
k4=DataFrame(k3)

#只有1个数据时使用这个

#k4=DataFrame(k3,index=[0]) 

组合为dataframe

 案例:a2= pd.DataFrame([[b1], [b2], [b3]],index=[a1.at[2, '姓名'], a1.at[3, '姓名'],a1.at[4, '姓名']],columns=['分数']) 

百分比显示

案例1:

a9['不良率%'] = a9['不良率'].apply(lambda x: '%.2f%%' % (x*100))
a9.drop(columns=['不良率'], inplace=False)

案例2:a9.style.format("{:.2%}",subset=['不良率'])

时间格式处理,使用这2个包

import time
import datetime

转时间格式c6['TIME'] = pd.to_datetime(c6['TIME']) # date转为时间格式
基于现有时间列新增列(日期、周次、星期等)

df['week'] = df['日期'].dt.weekday

df['日'] = df['日期'].dt.day
df['week_name'] = df['日期'].dt.weekday_name

基于现有时间列进行列时间加减

(单值一样)

a1['开始时间减一天']=a1['开始时间']+ datetime.timedelta(days = -1)

a1['开始时间'][0]+ datetime.timedelta(days = -1)

获取当地时间

a1['运行时间']=time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())

a1['运行时间']=datetime.datetime.now()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值