熊猫功能丰富,很多方法不需要一直记,用的时候找就行了。
比较流行的方式是在速查手册中寻找合适的方法,然后查看方法的参数,进行测试和使用。(根据方法参数推荐Pycharm)
关注本号:健哥笔记,回复pandas,获取高清打印版快速查表。
首先给出了快速查找表,然后详细讲解了熊猫中常用的方法。
df.columns=['a','b','c']#重命名列名df.columns=df.columns.str.replace('','_')#列名空格换下划线df.loc[df.AAA>=5,['BBB','CCC']]=555#替换数据df['pf']=df.site_id.map({2:'小程序',7:'M站'})#将枚举换成名称pd.isnull()#检查DataFrame对象中的空值,并返回一个Boolean数组pd.notnull()#检查DataFrame对象中的非空值,并返回一个Boolean数组df.drop(['name'],axis=1)#删除列df.drop([0,10],axis=0)#删除行deldf['name']#删除列df.dropna()#删除所有包含空值的行df.dropna(axis=1)#删除所有包含空值的列df.dropna(axis=1,thresh=n)#删除所有小于n个非空值的行df.fillna(x)#用x替换DataFrame对象中所有的空值df.fillna(value={'prov':'未知'})#指定列的空值替换为指定内容s.astype(float)#将Series中的数据类型更改为float类型df.index.astype('datetime64[ns]')#转化为时间格式s.replace(1,'one')#用‘one’代替所有等于1的值s.replace([1,3],['one','three'])#用'one'代替1,用'three'代替3df.rename(columns=lambdax:x+1)#批量更改列名df.rename(columns={'old_name':'new_name'})#选择性更改列名df.set_index('column_one')#更改索引列df.rename(index=lambdax:x+1)#批量重命名索引#重新命名表头名称df.columns=['UID','当前待打款金额','认证姓名']df['是否设置提现账号']=df['状态']#复制一列df.loc[:,::-1]#列顺序反转df.loc[::-1]#行顺序反转,下方为重新定义索引df.loc[::-1].reset_index(drop=True)
#保留小数位,四舍六入五成双df.round(2)#全部df.round({'A':1,'C':2})#指定列df['Name']=df.Name#取列名的两个方法df[df.index=='Jude']#索引列的查询要用.indexdf[df[col]>0.5]#选择col列的值大于0.5的行#多条件查询df[(df['team']=='A')&(df['Q1']>80)&df.utype.isin(['老客','老访客'])]#筛选为空的内容df[df.order.isnull()]#类似SQLwhereindf[df.team.isin('A','B')]df[(df.team=='B')&(df.Q1==17)]df[~(df['team']=='A')|(df['Q1']>80)]#非,或df[df.Name.str.contains('张')]#包含字符df.sort_values(col1)#按照列col1排序数据,默认升序排列df.col1.sort_values()#同上,->sdf.sort_values(col2,ascending=False)#按照列col1降序排列数据#先按列col1升序排列,后按col2降序排列数据df.sort_values([col1,col2],ascending=[True,False])df2=pd.get_dummies(df,prefix='t_')#将枚举的那些列带枚举转到列上s.set_index().plot()#多索引处理dd.set_index(['utype','site_id','p_day'],inplace=True)dd.sort_index(inplace=True)#按索引排序dd.loc['新访客',2,'2019-06-22'].plot.barh()#loc中按顺序指定索引内容#前100行,不能指定行,如:df[100]df[:100]#只取指定行df1=df.loc[0:,['设计师ID','姓名']]#将ages平分成5个区间并指定labelsages=np.array([1,5,10,40,36,12,58,62,77,89,100,18,20,25,30,32])pd.cut(ages,[0,5,20,30,50,100],labels=[u"婴儿",u"青年",u"中年",u"壮年",u"老年"])daily_index.difference(df_work_day.index)#取出差别#格式化df.index.name#索引的名称strdf.columns.tolist()df.values.tolist()df.总人口.values.tolist()data.apply(np.mean)#对DataFrame中的每一列应用函数np.meandata.apply(np.max,axis=1)#对DataFrame中的每一行应用函数np.maxdf.insert(1,'three',12,allow_duplicates=False)#插入列(位置、列名、[值])df.pop('class')#删除列#增加一行df.append(pd.DataFrame({'one':2,'two':3,'three':4.4},index=['f']),sort=True)#指定新列iris.assign(sepal_ratio=iris['SepalWidth']/iris['SepalLength']).head()df.assign(rate=lambdadf:df.orders/df.uv)#shift函数是对数据进行平移动的操作df['增幅']=df['国内生产总值']-df['国内生产总值'].shift(-1)df.tshift(1)#时间移动,按周期#和上相同,diff函数是用来将数据进行移动之后与原数据差#异数据,等于df.shift()-dfdf['增幅']=df['国内生产总值'].diff(-1)#留存数据,因为最大一般为数据池df.apply(lambdax:x/x.max(),axis=1)#取best列中值为列名的值写到name行上df['value']=df.lookup(df['name'],df['best'])s.where(s>1,10)#满足条件下数据替换(10,空为NaN)s.mask(s>0)#留下满足条件的,其他的默认为NaN#所有值加1(加减乘除等)df+1/df.add(1)#管道方法,链式调用函数,f(df)=df.pipe(f)defgb(df,by):result=df.copy()result=result.groupby(by).sum()returnresult#调用df.pipe(gb,by='team')#窗口计算'2s'为两秒df.rolling(2).sum()#在窗口结果基础上的窗口计算df.expanding(2).sum()#超出(大于、小于)的值替换成对应值df.clip(-4,6)#AB两列想加增加C列df['C']=df.eval('A+B')#和上相同效果df.eval('C=A+B',inplace=True)#数列的变化百分比s.pct_change(periods=2)#分位数,可实现时间的中间点df.quantile(.5)#排名average,min,max,first,dense,默认averages.rank()#数据爆炸,将本列的类列表数据和其他列的数据展开铺开df.explode('A')#枚举更新status={0:'未执行',1:'执行中',2:'执行完毕',3:'执行异常'}df['taskStatus']=df['taskStatus'].apply(status.get)df.assign(金额=0)#新增字段df.loc[('bar','two'),'A']#多索引查询df.query('i0=="b"&i1=="b"')#多索引查询方法2#取多索引中指定级别的所有不重复值df.index.get_level_values(2).unique()#去掉为零小数,12.00->12df.astype('str').applymap(lambdax:x.replace('.00',''))#插入数据,在第三列加入「两倍」列df.insert(3,'两倍',df['值']*2)#枚举转换df['gender']=df.gender.map({'male':'男','female':'女'})#增加本行之和列df['Col_sum']=df.apply(lambdax:x.sum(),axis=1)#对指定行进行加和col_list=list(df)[2:]#取请假范围日期df['总天数']=df[col_list].sum(axis=1)#计算总请假天数#对列求和,汇总df.loc['col_sum']=df.apply(lambdax:x.sum())#按指定的列表顺序显示df.reindex(order_list)#按指定的多列排序df.reindex(['col_1','col_5'],axis="columns")
df[col]#根据列名,并以Series的形式返回列df[[col1,col2]]#以DataFrame形式返回多列df.loc[df['team']=='B',['name']]#按条件查询,只显示name列s.iloc[0]#按位置选取数据s.loc['index_one']#按索引选取数据df.loc[0,'A':'B']#A到B字段的第一行df.loc[2018:1990,'第一产业增加值':'第三产业增加值']df.loc[0,['A','B']]#d.loc[位置切片,字段]df.iloc[0,:]#返回第一行,iloc只能是数字df.iloc[0,0]#返回第一列的第一个元素dc.query('site_id>8andutype=="老客"').head()#可以andor/&|#迭代器及使用foridx,rowindf.iterrows():row['id']#迭代器对每个元素进行处理df.loc[i,'链接']=f'http://www.gairuo.com/p/{slug}.html'foriindf.Name:print(i)#迭代一个列#按列迭代,[列名,列中的数据序列S(索引名值)]forlabel,contentindf.items():print(label,content)#按行迭代,迭代出整行包括索引的类似列表的内容,可row[2]取forrowindf.itertuples():print(row)df.at[2018,'总人口']#按行列索引名取一个指定的单个元素df.iat[1,2]#索引和列的编号取单个元素s.nlargest(5).nsmallest(2)#最大和最小的前几个值df.nlargest(3,['population','GDP'])df.take([0,3])#指定多个行列位置的内容#按行列截取掉部分内容,支持日期索引标签ds.truncate(before=2,after=4)#将dataframe转成seriesdf.iloc[:,0]float(str(val).rstrip('%'))#百分数转数字df.reset_index(inplace=True)#取消索引
df.groupby(col)#返回一个按列col进行分组的Groupby对象df.groupby([col1,col2])#返回一个按多列进行分组的Groupby对象df.groupby(col1)[col2]#返回按列col1进行分组后,列col2的均值#创建一个按列col1进行分组,并计算col2和col3的最大值的数据透视表df.pivot_table(index=col1,values=[col2,col3],aggfunc=max,as_index=False)#同上df.pivot_table(index=['site_id','utype'],values=['uv_all','regist_num'],aggfunc=['max','mean'])df.groupby(col1).agg(np.mean)#返回按列col1分组的所有列的均值#按列将其他列转行pd.melt(df,id_vars=["day"],var_name='city',value_name='temperature')#交叉表是用于统计分组频率的特殊透视表pd.crosstab(df.Nationality,df.Handedness)#groupby后排序,分组agg内的元素取固定个数(df[(df.p_day>='20190101')].groupby(['p_day','name']).agg({'uv':sum}).sort_values(['p_day','uv'],ascending=[False,False]).groupby(level=0).head(5)#每天取5个页面.unstack().plot())#合并查询经第一个看(max,min,last,size:数量)df.groupby('结算类型').first()#合并明细并分组统计加总('max',`mean`,`median`,#`prod`,`sum`,`std`,`var`,'nunique'),'nunique'为去重的列表df1=df.groupby(by='设计师ID').agg({'结算金额':sum})df.groupby(by=df.pf).ip.nunique()#groupbydistinct,分组+去重数df.groupby(by=df.pf).ip.value_counts()#groupby分组+去重的值及数量df.groupby('name').agg(['sum','median','count'])
#合并拼接行#将df2中的行添加到df1的尾部df1.append(df2)#指定列合并成一个新表新列ndf=(df['提名1'].append(df['提名2'],ignore_index=True).append(df['提名3'],ignore_index=True))ndf=pd.DataFrame(ndf,columns=(['姓名']))#将df2中的列添加到df1的尾部df.concat([df1,df2],axis=1)#合并文件的各行df1=pd.read_csv('111.csv',sep='\t')df2=pd.read_csv('222.csv',sep='\t')excel_list=[df1,df2]#result=pd.concat(excel_list).fillna('')[:].astype('str')result=pd.concat(excel_list)[]result.to_excel('333.xlsx',index=False)#合并指定目录下所有的excel(csv)文件importglobfiles=glob.glob("data/cs/*.xls")dflist=[]foriinfiles:dflist.append(pd.read_excel(i,usecols=['ID','时间','名称']))df=pd.concat(dflist)#合并增加列#对df1的列和df2的列执行SQL形式的joindf1.join(df2,on=col1,how='inner')#用key合并两个表df_all=pd.merge(df_sku,df_spu,how='left',left_on=df_sku['product_id'],right_on=df_spu['p.product_id'])
#时间索引df.index=pd.DatetimeIndex(df.index)#时间只保留日期df['date']=df['time'].dt.date#将指定字段格式化为时间类型df["date"]=pd.to_datetime(df['时间'])#转化为北京时间df['time']=df['time'].dt.tz_convert('Asia/Shanghai')#转为指定格式,可能会失去秒以后的精度df['time']=df['time'].dt.strftime("%Y-%m-%d%H:%M:%S")dc.index=pd.to_datetime(dc.index,format='%Y%m%d',errors='ignore')#时间,参与运算pd.DateOffset(days=2)#当前时间pd.Timestamp.now()pd.to_datetime('today')#判断时间是否当天pd.datetime.today().year==df.start_work.dt.yeardf.time.astype('datetime64[ns]').dt.date==pd.to_datetime('today')#定义个天数importdatetimedays=lambdax:datetime.timedelta(days=x)days(2)#同上,直接用pd包装的pd.Timedelta(days=2)#unix时间戳pd.to_datetime(ted.film_date,unit='ms')#按月(YMDHminS)采集合计数据df.set_index('date').resample('M')['quantity'].sum()df.set_index('date').groupby('name')['extprice'].resample("M").sum()#按天汇总,index是datetime时间类型df.groupby(by=df.index.date).agg({'uu':'count'})#按周汇总df.groupby(by=df.index.weekday).uu.count()#按月进行汇总df.groupby(['name',pd.Grouper(key='date',freq='M')])['extprice'].sum()#按月进行汇总df.groupby(pd.Grouper(key='day',freq='1M')).sum()#按照年度,且截止到12月最后一天统计extprice的sum值df.groupby(['name',pd.Grouper(key='date',freq='A-DEC')])['extprice'].sum()#按月的平均重新采样df['Close'].resample('M').mean()#https://pandas.pydata.org/pandas-docs/stable/user_guide/timeseries.html#offset-aliases#取时间范围,并取工作日rng=pd.date_range(start="6/1/2016",end="6/30/2016",freq='B')#重新定时数据频度,按一定补充方法df.asfreq('D',method='pad')#时区,df.tz_convert('Europe/Berlin')df.time.tz_localize(tz='Asia/Shanghai')#转北京时间df['Time']=df['Time'].dt.tz_localize('UTC').dt.tz_convert('Asia/Shanghai')#查看所有时区frompytzimportall_timezonesprint(all_timezones)#时长,多久,两个时间间隔时间,时差df['duration']=pd.to_datetime(df['end'])-pd.to_datetime(df['begin'])#指定时间进行对比df.Time.astype('datetime64[ns]')
#https://pbpython.com/styling-pandas.htmldf['per_cost']=df['per_cost'].map('{:,.2f}%'.format)#显示%比形式#指定列表(值大于0)加背景色df.style.applymap(lambdax:'background-color:grey'ifx>0else'',subset=pd.IndexSlice[:,['B','C']])#最大值最小值加背景色df.style.highlight_max(color='lightgreen').highlight_min(color='#cd4f39')df.style.format('{:.2%}',subset=pd.IndexSlice[:,['B']])#显示百分号#指定各列的样式format_dict={'sum':'${0:,.0f}','date':'{:%Y-%m}','pct_of_total':'{:.2%}''c':str.upper}#一次性样式设置(df.style.format(format_dict)#多种样式形式.hide_index()#指定列按颜色深度表示值大小,cmap为matplotlibcolormap.background_gradient(subset=['sum_num'],cmap='BuGn')#表格内作横向bar代表值大小.bar(color='#FFA07A',vmin=100_000,subset=['sum'],align='zero')#表格内作横向bar代表值大小.bar(color='lightgreen',vmin=0,subset=['pct_of_total'],align='zero')#下降(小于0)为红色,上升为绿色.bar(color=['#ffe4e4','#bbf9ce'],vmin=0,vmax=1,subset=['增长率'],align='zero')#给样式表格起个名字.set_caption('2018SalesPerformance').hide_index())#按条件给整行加背景色(样式)defbackground_color(row):ifrow.pv_num>=10000:return['background-color:red']*len(row)elifrow.pv_num>=100:return['background-color:yellow']*len(row)return['']*len(row)#使用df.style.apply(background_color,axis=1)
df88.plot.bar(y='rate',figsize=(20,10))#图形大小,单位英寸df_1[df_1.p_day>'2019-06-01'].plot.bar(x='p_day',y=['total_order_num','order_user'],figsize=(16,6))#柱状图#每条线一个站点,各站点的home_remain,stack的意思是堆叠,堆积#unstack即“不要堆叠”(df[(df.p_day>='2019-05-1')&(df.utype=='老客')].groupby(['p_day','site_id'])['home_remain'].sum().unstack().plot.line())#折线图,多条,x轴默认为indexdd.plot.line(x='p_day',y=['uv_all','home_remain'])dd.loc['新访客',2].plot.scatter(x='order_user',y='paid_order_user')#散点图dd.plot.bar(color='blue')#柱状图,barh为横向柱状图sns.heatmap(dd.corr())#相关性可视化#刻度从0开始,指定范围ylim=(0,100),x轴相同s.plot.line(ylim=0)#折线颜色https://matplotlib.org/examples/color/named_colors.html#样式('-','--','-.',':')#折线标记https://matplotlib.org/api/markers_api.html#grid=True显示刻度etc:https://matplotlib.org/api/_as_gen/matplotlib.pyplot.plot.htmls.plot.line(color='green',linestyle='-',marker='o')#两个图绘在一起[df['数量'].plot.kde(),df['数量'].plot.hist()]#对表中的数据按颜色可视化importseabornassnscm=sns.light_palette("green",as_cmap=True)df.style.background_gradient(cmap=cm,axis=1)#将数据转化为二维数组[iforiinzip([i.strftime('%Y-%m-%d')foriins.index.to_list()],s.to_list())]#和plot用法一样https://hvplot.pyviz.org/user_guide/Plotting.htmlimporthvplot.pandas#打印Sqlite建表语句print(pd.io.sql.get_schema(fdf,'table_name'))
END!
上一篇:2个月大的比熊犬怎么养活
下一篇:酒杯的别称和雅称