针对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['成绩'].mean() |
获取列去重值 | set(df['成绩']) |
生成空df | df = pd.DataFrame() |
功能类
表格处理 | 案例 |
保留正确的 | 案例: df3=df2[df2['学生']=='李明'] 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)] |
保留要的列 | # a3有“时间1”、“时间2”、“时间3”、“时间4” a3[['时间1','时间2']] |
列合并 | 案例:a1['学校学院'] = a1['学校'].map(str) + a1['学院'].map(str) |
增加1列 | 案例1:a1.insert(0,'数量',1) 案例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=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 = 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'] #只有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)) 案例2:a9.style.format("{:.2%}",subset=['不良率']) |
时间格式处理,使用这2个包 import time | |
转时间格式 | c6['TIME'] = pd.to_datetime(c6['TIME']) # date转为时间格式 |
基于现有时间列新增列(日期、周次、星期等) | df['week'] = df['日期'].dt.weekday df['日'] = df['日期'].dt.day |
基于现有时间列进行列时间加减 (单值一样) | 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() |