Python——数据的清洗(2)

在对数据清洗的过程中,可能涉及将一列拆成多列、合并多个数据集等不同数据集之间的操作,可以使用一些python内置函数来达成目标。

1、pandas.merge() # 按某种方式合并两个数据集

data3 = pd.merge(data1, data2, how='outer')  # 将数据集data1和data2进行全外连接,合并成一个数据集
#参数how表示连接方式,有inner、left、right、outer,默认为inner

2、split() # 拆分

data1 = data.str.split('|',expand=True).\
rename(columns={0:'AA',1:'AB',2:'AC'})  
# 将data(series一列的数据)以‘|’拆分成data1的多列,并给新列命名(不用命名则去掉第一行.\及之后代码)

3、apply() # 对整行/列操作

经常要对数据进行一些人为的“打标签”分类过程,需要整行/列地批量操作,手动分类是不可能的,apply()函数这就派上了大用场。

举个栗子:将数据集data按照‘len’这一列值的大小进行离散化分类处理,自定义一个s_len()函数,将数据分为(0,50],(50,200],(200,350]和大于350四类,最后一行代码调用自定义的函数,在原数据集中新生成一列,将函数的分类结果写入。

def s_len(x):
    if x<=50:
        x='(0,50]'
    elif x<=200:
        x='(50-200]'
    elif x<=350:
        x='(200-350]'
    else:
        x='大于350'
    return x
    
data['dis_len']=data['len'].apply(s_len)  # 按列处理,新增一列'dis_len'

如果按行处理数据,要在apply()函数内写上参数axis=1(默认为0)

再举个栗子:

Python——数据的清洗(2)_第1张图片

 图为周一至周天的报价数据集(True:有报价,False:无报价),依据每行数据的报价情况将其分为‘仅工作日’、‘仅周末’、‘工作日和周末’以及有数据缺失的‘NaN’四类。

def jud(x1,x2,x3,x4,x5,x6,x7):  
    if x1 and x7:  # 周末两天都没报价
        if x2 and x3 and x4 and x5 and x6:  # 工作日都没报价
            return 'NaN'
        else:
            return '仅工作日'
    else:    # 周末至少有一天有报价 
        if x2 and x3 and x4 and x5 and x6:
                return '仅周末'
        else:  # 工作日至少有一天有报价
                return '工作日和周末'       
   
       
data['Date']=data.apply(lambda row:jud(row['SunPrice'],row['MonPrice'],row['TuesPrice'],
row['WedPrice'],row['ThusPrice'],row['FriPrice'],row['SatPrice']),axis=1)
# axis=1按行处理:将每一行输入函数,写入新的一列“Date”

 python还有许多内置包/函数,像提取字符常用的正则表达式搭配re包(findall()函数...),做一些特殊分割的strip()等等,需要在实践中去探索......

你可能感兴趣的:(Python,pandas)