python实现csv、excel操作的整理(pandas)

一、导入数据

# 导入相关库
import pandas as pd 
import numpy as np
import os
import re

df = pa.read_excel(r"C:\Users\12285\Desktop\(数据文件名称).xlsx")  # 读取文件

二、数据的基本处理

1)map()的用法

假设我们要增加一列c,规则是如果a列数字小于等于50则c列为1,否则c列为0,则:

abc
35
42
53
df.loc[:,'c']=df['a'].map(lambda s:1 if s<=50 else 0)

对规则条件下,需要我们自定义函数,例如我们要增加一列c,规则是如果a列小于50且b列为男则c列为1,否则c列为0


#先定义一个函数xinlie()
def xinlie(x,y):
    if  (x<=50)&(y=='男'):
        return 1
    else:
        return 0
#新增c列
df.loc[:,'c']=list(map(lambda x,y:is_qiang(x,y),df['a'],df['b']))

2)查看列名和数据类型

print(df.columns)  #查看列名
print(df.dtypes)    #查看各列数据类型

 3)查看指定行列数据

print(df.head(20)) #查看前20行数据
df=df.loc[:,'FFMC':'rain']     #选择FFMC到rain列所有数据

 4)删除行或列

df=df.drop(['wind', 'rain', 'area'],axis=1)           #删除wind,rain和area三列
df_an=df_an.loc[-(df_an['qudao']=='Total')]  #删除qudao列等于'Total'的行

5) 移除重复数据

df_new=df.drop_duplicates(['month','day'])  
#移除month和day列包含重复值得行,保留第一个
df_new=df.drop_duplicates(['month'],take_last=True )
#移除month列包含重复值得行,保留最后一个

 6)更改列名

df.rename(columns={'ISI':'isi'}, inplace = True) #ISI列列名改为isi

 三、描述性统计

1)计算某列变量频数

print(df['month'].unique())     #输出month列唯一值
print(df['month'].value_counts())   #输出month列各变量出现频数

2)分段统计

bins=[0,10,20,30,40,50,60,70,80,90,100]
group_names=['0-10','10-20','20-30','30-40',
'40-50','50-60','60-70','70-80','80-90','90-100']
cats=pd.cut(df['RH'],bins,labels=group_names)
pd.value_counts(cats,sort=False)

3)添加一列分组列,做多维频数统计

bins=[0,10,20,30,40,50,60,70,80,90,100]
group_names=['0-10','10-20','20-30','30-40','40-50',
'50-60','60-70','70-80','80-90','90-100']
cats=pd.cut(df['RH'],bins,labels=group_names)
df_concat=pd.concat([df,cats],axis=1,ignore_index=True)
df_group=df_concat[7].groupby([df_concat[0],df_concat[6],df_concat[7]])
df_fum=df_group.agg('count')

4)移除重复数据

df_new=df.drop_duplicates(['month','day'])  
#移除month和day列包含重复值得行,保留第一个
df_new=df.drop_duplicates(['month'],take_last=True )
#移除month列包含重复值得行,保留最后一个

四、填充缺失值

1、缺失值统计

1)显示有缺失值的行

df[df.isnull().values==True] #显示有缺失值的行

2)增加一列,显示每行的缺失值

df_na=(df.isnull()).sum(axis=1) #统计每行的缺失值
df=pd.concat([df,df_na],axis=1) #df和df_na横向拼接
df.rename(columns={0:'na_num'}, inplace = True) #更改列名
df=df.loc[df['na_num']<=5]#删去变量值大于5的行

2、填充缺失值

1)删除含有缺失值的行(或者全为NA的行)

df.dropna()#删除含有缺失值的行
df.dropna(how='all')#只丢弃全为NA的那些行

2)填充固定值

train_data.fillna(0, inplace=True) # 填充 0

3)填充均值

df['DC'].fillna(df['DC'].mean(),inplace=True) # 填充均值

4)填充中位数

df['DC'].fillna(df['DC'].median(),inplace=True) #DC列缺失值填充为DC列的中位数

5)填充众数

df['DC'].fillna(df['DC'].mode(),inplace=True) # 填充众数
#循环用众数填充每列缺失值,若众数为na的情况,删掉na
features=['X', 'Y', 'month', 'day', 'FFMC', 'DMC', 'DC', 'ISI', 'temp', 'RH',
       'wind', 'rain', 'area']
features_mode = {}
for f in features:
    print (f,':', list(df[f].dropna().mode().values))
    features_mode[f] = list(df[f].dropna().mode().values)[0]
df.fillna(features_mode,inplace=True)

6)填充上下条的数据

df['DC'].fillna(method='pad', inplace=True) 
df['DC'].fillna(0, inplace=True)# 前一条没值就填充0
df['DC'].fillna(method='bfill', inplace=True) 
df['DC'].fillna(0, inplace=True)# 后一条没值就填充0

 五、筛选

1)条件筛选loc

df_sel=df.loc[(df['month']=='aug') & (df['DC']>=600)] 
#筛选month列等于aug且DC列大于600的所有行

2)生成新列,并按条件赋值

假设我们要增加一列c,规则是如果a列数字小于等于50则c列为1,否则c列为0

abc
35
42
53
df.loc[:,'c']=df['a'].map(lambda s:1 if s<=50 else 0)

对规则条件下,需要我们自定义函数,例如我们要增加一列c,规则是如果a列小于50且b列为男则c列为1,否则c列为0

#先定义一个函数xinlie()
def xinlie(x,y):
    if  (x<=50)&(y=='男'):
        return 1
    else:
        return 0
#新增c列
df.loc[:,'c']=list(map(lambda x,y:is_qiang(x,y),df['a'],df['b']))

3)模糊筛选/精确筛选:isin(),contains()

df_sel1=df[df['day'].str.contains('fr')]   # 筛选day列包含fr字符的行
df_sel2=df[df['day'].isin(['fri','mon'])]   # 筛选day列等于fri或mon的行

六、替换

1)去掉字符串两端空格

df_city['experience_new'] = df_city['experience'].map(lambda s: s.strip())
#experience列中文前后端包含空格,需对改列进行分词处理(去掉空格),赋值给新列experience_new

2)替换

#将experience_new列中的应届毕业生替换为1年以下
df_city = df_city.replace({'experience_new':'应届毕业生'},'1年以下')
df_city['expreienct_new']=df_city['expreienct_new'].map(lambda s:re.sub('应届毕业生','1年以下',s))

七、提取字符串

 

1)分列

df['new']=df['day'].map(lambda s:re.compile(':').split(s)[0])
#对df['day']列按照符号':'进行分列并提取第一个值,赋值到新列df['new']

2)搜索字符串

df['xin']='U34' #增加新列,列名为xin,为新列赋值U34
df['zimu']=df['xin'].map(lambda s:re.compile("([0-9]+)").search(s).group()[0])
#搜索字母并提取第一个值
df['shuzi']=df['xin'].map(lambda s:re.compile("[a-zA-Z]+").search(s).group()[0])
#搜索字母并提取第一个值

3)自己写函数

def chuli(s):
    jieguo=re.compile("([0-9]+)").search(s)
    if jieguo:
        jieguo=int(jieguo.group())+1
    else :
        jieguo=0
    return jieguo
df['Room']=df['Cabin'].map(chuli)

八、关联与匹配

 

1、两表关联:merge(左关联,右关联)

比如有以下两个数据集

df1 客户信息表

customer_id sex city
10084 男 北京
10085 女 上海
10086 男 广州
10087 女 深圳

df2订单表

order customer_id product shouru
CH0001 10086 A 500
CH0002 10086 B 200
CH0003 10085 C 1000
CH0004 10084 D 3000

1)左关联

df_merge=pd.merge(df1,df2,on='customer_id',how='left') #左关联
print(df_merge)

注意第三四列,与EXCEL匹配的逻辑稍有不同

2)根据多列进行左关联

这个暂时不举例了,遇到这种情况再说

pd.merge(df1,df2,on=['key1','key2'],how='left')#多键连接

2、多表关联

1)轴向连接:concat()

pd.concat([df1,df2],axis=1,ignore_index=True)#df1和df2横向拼接

2)多表关联:reduce()

from functools import reduce
df_list=[df_dau,df_gmv_zx,df_dau_zx]
df_zhengti=reduce(lambda left,right:pd.merge(left,right,on=['event_date','duan'],how='left'),df_list) 
#按照event_date,duan 从左到右对df_list中的文件进行左关联

 九、聚合(数据透视表)

类似于数据透视表

类似于sumifs(),countifs(),averageifs()等函数的效果

1)聚合groupby()

df_group=df['DC'].groupby([df['month'],df['day']]) #根据month和day列对DC列进行聚合
df_fun=df_gorup.agg(['sum','mean','std']) #对df_group求和,均值和标准差
print(df_fun)

2)数据透视表pd.pivot_table()

这个函数比较难记,可以参考EXCEL数据透视表去理解,index代表列,columns代表行,values代表值,aggfunc代表要对值用什么函数,fil_value代表缺失值用0填充

df_toushi=pd.pivot_table(df,index=['month'],columns=['day'],
         values=['DC'],aggfunc=[np.sum,np.mean],fill_value=0)
print(df_toushi)

 十、排序

按照DMC列降序,DC列升序对数据集进行排序,(ascending设置正逆序)

df_paixu=df.sort_values(by=['DMC','DC'],ascending=[0,1]) 

 十一、时间序列处理

1、csv中的时间会被读取为字符串,需要批量处理为pandas可处理的时间类型

df['date']=pd.to_datetime(df['createTime']) #批量转换createTime中的时间,并赋值到date列
df[(df['date']>='20140701')&(df['date']<='20140715')]#筛选指定时间段数据

2、时间设置

from datetime import datetime, timedelta
import time
today = datetime.today()#今天
yesterday_ts = time.time() - 24 * 3600#昨天
yesterday = datetime.fromtimestamp(yesterday_ts).strftime('%Y-%m-%d') #转换为年月日
fromtime =  (today -timedelta(16)).strftime('%Y-%m-%d') #16天前,并转化为年月日
day_before_yesterday_ts = yesterday_ts - 24*3600#前天
day_before_yesterday = datetime.fromtimestamp(day_before_yesterday_ts).strftime('%Y-%m-%d')

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值