pandans入门教程
程序员文章站
2022-06-14 23:27:15
...
本篇博文将持续更新记录在工作中使用到的技巧
载入数据
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)
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]
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['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 # 分钟
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:所有相同的都被标记为重复
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']
空值筛选
df_unuse=df[df.Merchant_id.notnull() & df.Date.isnull()]
Apply()函数的应用
#转换成折扣率 前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_pure["weekend"]=df_pure.apply(mark_weekend, axis=1) #如果不加axis=1,默认是遍历列
填充空值
df['Distance']=df['Distance'].fillna(-1).astype(int)