pandans入门教程

本篇博文将持续更新记录在工作中使用到的技巧

载入数据

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)
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值