本篇博文将持续更新记录在工作中使用到的技巧
载入数据
1.read_table可以指定分隔符
import pandas as pd
data = pd.read_table('Z:/test.txt',header=None,sep=',',encoding='gb2312',delim_whitespace=True,index_col=0)
#header=None:没有每列的column name,可以自己设定
#encoding='gb2312':其他编码中文显示错误
#delim_whitespace=True:用空格来分隔每行的数据
#index_col=0:设置第1列数据作为index
#seq 间隔符号为, 默认是tab
2.读csv
data1=pd.read_csv=("test.csv")#自动把第一行作列属性,第一行不能用
data2pd.read_csv("test.cvs",hearder=None)#不把第一行作列属性
3.读带有datetime的CSV
parse_dates = ['date_received', 'date']
df_pure=pd.read_csv('F:\\Github\\final_ccf_offline_stage1_train.csv',parse_dates=parse_dates)
建立空的df
df_empty = pd.DataFrame(columns=['A', 'B', 'C', 'D'])
dataframe 存储
#是否保留列名 header: Whether to write out the column names (default True)
df.to_csv(‘path/Result.csv’,header=0) #不保存列名
#是否保留行索引 index: whether to write row (index) names (default True)
df.to_csv(‘path/Result1.csv’,index=0) #不保存行索引
dataframe数据切片
1.选择行列
dataframe.loc[ row_start:row_stop,[col_name]]
2.筛选满足条件的行
train_data = dataframe[dataframe['DAY'] < day]
3.选择某行的值
pre_time=sorted_value.loc[0:1,:] #得到的事dataframe
pre_time=sorted_value.loc[0,:] #得到的series
df['three'][22]=5
4.删除row
#.drop()方法如果不设置参数inplace=True,则只能在生成的新数据块中实现删除效果,而不能删除原有数据块的相应行。
data = odata.drop([16,17])
修改数据类型
df[['two', 'three']] = df[['two', 'three']].astype(float)
df重置索引行
df.reset_index(inplace=True, drop=True)
获得df的行数
rownum = group.iloc[:, 0].size
dataframe时间相关的操作
1.str与时间相互转换
#string变成datetime格式
dates = pd.to_datetime(pd.Series([‘20010101’, ‘20010331’]), format = ‘%Y%m%d’)
#datetime变回string格式
dates.apply(lambda x: x.strftime(‘%Y-%m-%d’))
2.日期获得年月日星期几
#data.PASS_TIME是一个serises
# 构造时间特征
data['YEAR'] = data.PASS_TIME.dt.year # 年份
data['MONTH'] = data.PASS_TIME.dt.month # 月份
data['DAY'] = data.PASS_TIME.dt.day # 天
data['WEEKDAY'] = data.PASS_TIME.dt.weekday # 星期
data['HOUR'] = data.PASS_TIME.dt.hour # 小时
data['MINUTE'] = data.PASS_TIME.dt.minute # 分钟
#row.PASS_TIME 是一个值
data['MINUTE'] = row.PASS_TIME.minute # 分钟
3.两个时间比较
date=pd.to_datetime('2000-01-01')
date2=pd.to_datetime('2000-02-01')
timediff = pd.Timedelta(6,unit='h')
flag=s.date - date < timediff
dataframe删除列
del dataframe['column-name']
df去重
#Pandas提供了duplicated、Index.duplicated、drop_duplicates函数来标记及删除重复记录
#duplicated函数用于标记Series中的值、DataFrame中的记录行是否是重复,重复为True,不重复为False
pandas.DataFrame.duplicated(self, subset=None, keep='first')
pandas.Series.duplicated(self, keep='first')
#其中参数解释如下:
#subset:用于识别重复的列标签或列标签序列,默认所有列标签
#keep=‘frist’:除了第一次出现外,其余相同的被标记为重复
#keep='last':除了最后一次出现外,其余相同的被标记为重复
#keep=False:所有相同的都被标记为重复
深拷贝
cc=bb[['one','three']].copy()
dataframe分组
group=df.groupby(by=['plate_info_ex','date_type','tollgate_id'])
1.查看分组
import pandas as pd
ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings',
'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'],
'Rank': [1, 2, 2, 3, 3,4 ,1 ,1,2 , 4,1,2],
'Year': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017], 'Points':[876,789,863,673,741,812,756,788,694,701,804,690]}
df = pd.DataFrame(ipl_data)
print (df.groupby('Team').groups)
{
'Devils': Int64Index([2, 3], dtype='int64'),
'Kings': Int64Index([4, 6, 7], dtype='int64'),
'Riders': Int64Index([0, 1, 8, 11], dtype='int64'),
'Royals': Int64Index([9, 10], dtype='int64'),
'kings': Int64Index([5], dtype='int64')
}
2.迭代查看分组
grouped = df.groupby('Year')
for name,group in grouped:
print (name)
print (group) #得到的group是df
3.迭代查看df的行
for intdex,j in group.iterrows():
print(j) #j是Series
4.统计分组的记录数
df.size()
查看数据总数
len(df.index)
数据查找
#查找colname为a的所有行
df[df['colname'] == 'a']
p=df[(df.PLATE_INFO == 0)&(df.TOLLGATE_ID == 340)]
空值筛选
df_unuse=df[df.Merchant_id.notnull() & df.Date.isnull()]
Apply()函数的应用
对serises使用
#转换成折扣率 前1000 满减:折扣:空 637:21:342
def discount_gain(row):
if type(row)==str :
arr=row.split(':')
if(len(arr)<2):
return float(arr[0])
else:
weight=round(float(arr[1])/float(arr[0]),2)
return weight
elif pd.isnull(row) :
return 1.0
df['discount_rate'] = df['Discount_rate'].apply(discount_gain)
效果如下图:
对df使用
def is_use(row):
Coupon_id = row['Coupon_id']
Date = row['Date']
if pd.notnull(Coupon_id)and pd.notnull(Date) :
return 1
elif pd.isnull(Coupon_id)and pd.notnull(Date):
return 2
elif pd.notnull(Coupon_id) and pd.isnull(Date):
return 0
train_df['use_type'] =train_df.apply(is_use,axis=1)
填充空值
df['Distance']=df['Distance'].fillna(-1).astype(int)
排序
#coding=utf-8
import pandas as pd
import numpy as np
#以下实现排序功能。
series=pd.Series([3,4,1,6],index=['b','a','d','c'])
frame=pd.DataFrame([[2,4,1,5],[3,1,4,5],[5,1,4,2]],columns=['b','a','d','c'],index=['one','two','three'])
print frame
print series
print 'series通过索引进行排序:'
print series.sort_index()
print 'series通过值进行排序:'
print series.sort_values()
print 'dataframe根据行索引进行降序排序(排序时默认升序,调节ascending参数):'
print frame.sort_index(ascending=False)
print 'dataframe根据列索引进行排序:'
print frame.sort_index(axis=1)
print 'dataframe根据值进行排序:'
print frame.sort_values(by='a')
print '通过多个索引进行排序:'
print frame.sort_values(by=['a','c'])
修改某行某列的值
predict['count'][p_index]+=1
修改某行某列的值
predict['count'][p_index]+=1
获得index
#先通过条件筛选出某一行,类型还是df
p=predict[(predict.carid == carid) & (predict.tollgate== tollgate) & (predict.nextollgate == nextollgate)]
#获得df的index
p_index=p.index.tolist()[0]
pd获得TopN的列标签
def find_top(lists):
return lists.argsort()[::-1][:200]
top200=df.apply(find_top,axis=1)