欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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)

效果如下图:
pandans入门教程

df_pure["weekend"]=df_pure.apply(mark_weekend, axis=1)  #如果不加axis=1,默认是遍历列

填充空值

 df['Distance']=df['Distance'].fillna(-1).astype(int)