1 增:添加新列,合并与连接

1.1 添加新列

增加列用的是df[‘新列名’] = 新列值的方式,在原数据基础上赋值即可:

df['新增的列'] = range(1, len(df) + 1)

1.2 纵向合并

df = pd.concat([d1,d2,d3])
df

在这里插入图片描述

也可以设置axis=1,进行横向连接,但concat只能实现简单的逐一拼接,也就是说拼接与被拼接的对象要相同才行,否则会有很多空值。横向这事更多的还是用merge函数

1.3 横向连接

h1 = pd.DataFrame({'语文':[93,80,85,76,58],'数学':[87,99,95,85,70],'英语':[80,85,97,65,88]},
                 index = ['韩梅梅','李雷','李华','王明','铁蛋'])
h2 = pd.DataFrame({'篮球':[93,80,85,76],'舞蹈':[87,99,95,85]},
                 index = ['李华','王明','铁蛋','刘强'])
                 
print(h1.head())
print(h2.head())

在这里插入图片描述
两个DataFrame是两张成绩表,h1是5位同学的数学、英语、语文成绩,h2是4位同学的篮球和舞蹈成绩,两张表中姓名列是表的索引。
如果想找到并合并两张表同时出现的同学及其成绩,可以用merge方法:

pd.merge(left = h1,right = h2,left_index = True,right_index = True,how = 'inner')

在这里插入图片描述
我们来详解一下merge的参数,left和rgiht分别对应着需要连接的左表和右表,这里语数外成绩表是左表,篮球、舞蹈成绩是右表。

left_index与right_index是当我们用索引作为匹配列时需要设置的参数,设置为True,表示用该表的索引作为连接的条件或者说桥梁。此处left_index = True代表用左表的索引,姓名作为连接条件。
how的参数有inner(内连接)、left(左连接)、right(右连接)、outer(外连接)

  • inner(内连接)是取两个表格索引的交集

在这里插入图片描述

  • left(左连接)是取左表的索引为新表的索引,右表对应匹配
pd.merge(left = h1,right = h2,left_index = True,right_index = True,how = 'left')

在这里插入图片描述

  • right(右连接)则是将右表的索引作为新表的索引,左表对应匹配
pd.merge(left = h1,right = h2,left_index = True,right_index = True,how = 'right')

在这里插入图片描述

  • outer(外连接)则是取两表的全集
pd.merge(left = h1,right = h2,left_index = True,right_index = True,how = 'outer')

在这里插入图片描述
关于横向连接,需要强调的是,如果姓名不是表的索引,而表中某一列值,且需要根据姓名进行匹配,那我们就需要用“left_on = ‘姓名’,right_on = ‘姓名’”,分别指定左表的姓名列和右表的姓名列作为匹配连接字段。
因此也有以下参数on,

#创建第一个DataFrame 
df1 = pd.DataFrame({'姓名': ['小王', '小李', '小红'], 
                    '游戏': ['王者', '吃鸡', 'GTA'] }) 
                    
# 创建第二个DataFrame 
df2 = pd.DataFrame({'姓名': ['小王', '小李', '小红', '小白', '小王'], 
                '游戏': ['王者', '吃鸡', 'GTA', '王者', '帕鲁'], 
                '消费': [2000, 500, 298, 5000, 8000]})
                
merged_df = pd.merge(df1, df2, on=['姓名', '游戏'], how='left')

2 删:删除列和剔除噪声数据

2.1 删除列

我们用drop函数制定删除对应的列,axis = 1表示针对列的操作,inplace为True,则直接在源数据上进行修改,否则源数据会保持原样。

df.drop('新增的列', axis=1, inplace=True)

2.2 空缺值处理

2.2.1 删除缺失值:dropna()
# 要删除空值,使用dropna函数即可搞定
df.dropna()
# 需要注意的是,dropna函数默认删除所有出现空值的行,即只要一行中任意一个字段为空,就会被删除。我们可以设置subset参数,例如dropna(subset = ['支付金额']),来指定当一行中的支付金额字段为空时,才会被删除,其他字段为空并不影响。
df.dropna(subset = ['支付金额'])
2.2.2 填补缺失值:fillna()
# 缺啥补啥,比如补个蛋0
df.fillna(0)
# fillna还可以通过{}来指定列填充
df.fillna({'客单价':666,'支付金额':df['支付金额'].min()})

在这里插入图片描述
三级流量中客单价的空缺值已经用指定的666补全,支付金额则用的是金额最小值填充,由于没有指定访客数的填充,空缺值依然为NaN。

2.3 去除重复值

如果我们要把重复数据删掉,可以用drop_duplicates函数:

# subset可以指定基于流量级别这列进行去重,keep可以指定留下哪行数据,默认first,last则是留下最后一行。
df.drop_duplicates(subset = '流量级别', keep='last')

3 排

很多情况下,我们查询的时候需要通过排序来观察数据规律,以及快速筛选出TOP N的数据项。对于案例数据,我们怎么样按交易金额进行排序并筛选出TOP3的渠道呢? 问题的关键就在于排序,这个时候sort_values函数就派上用场了:

sort_df = df.sort_values('支付金额',ascending = False)
print(sort_df)

在这里插入图片描述
sort_values函数,顾名思义是按照数值进行排序,首先要传入的参数是列参数,即我们根据哪一列的数值来进行排序,如果多列排序的话需要用[]外括。ascending参数决定了排序顺序,等于Flase则是从大到小的降序,设置为True则是从小到大升序。
这里补充一个知识点,大家会发现无论是删空的dropna,还是去重的drop_duplicates,或者是排序的sort_values,在对源数据进行操作后,源数据并未改变,这是因为我们没有对这几个函数的inplace值进行设置,如果设置成inplace = True,删空、去重和排序都会在源数据上生效。

但这里为了避免出现不必要的错误而无法更改,更建议大家把操作后的源数据赋值给新的变量,如new = df.dropna(),而不是直接将源数据的inplace参数设置为True。

4 改:改变数据形态

数据的更改和新增操作很相近,用df[‘旧列名’] = 某个值或者某列值(列值的数量必须和原数据行数相等),就完成了对原列数值的修改,但这只是一个基本操作,这一节的改,并不是传统意义上改变数据的值,而是改变数据的形态。转置、分组和切分是Pandas常见的三个改变数据形态的操作。

4.1 转置

转置,就是把数据表的行列进行转换,原来的行数据变成列数据,列数据则变成行,常用df.T方法来实现,非常简单:

#以d2流量表为例
print(d2)
print(d2.T)

在这里插入图片描述

4.2 分组

4.2.1 groupby分组

在案例数据中,总的流量级别有三级,每一级下又有多个投放地区,如果我们想汇总看每个级别流量所对应的总访客数和支付金额,就需要用到分组了。

groupby是分组函数,最主要的参数是列参数,即按照哪一列或者哪几列(多列要用列表外括)进行汇总,这里是按照流量级别,并且直接分组之后,没有返回任何我们期望的数据,返回的是一个分组对象。要进一步得到数据,需要在分组的时候对相关字段进行计算(常用的计算方法包括sum、max、min、mean、std、count):

df.groupby('流量级别').sum()

在这里插入图片描述
后面加上了sum(),代表我们先按照流量级别进行分组,再对分组内的字段求和。由于没有指定求和的列,所以是对所有数值型字段进行了求和。此处我们只想要各级别流量下的访客数和支付金额,需要指明参数
此外,流量级别作为汇总的依据列,默认转化为索引列。在实际中变成索引处理起来不够方便,如果我们不希望它变成索引,向groupby内传入参数as_index = False即可:

df.groupby('流量级别', as_index = False)['访客数','支付金额'].sum()
#也可以用reset_index()方法
#df.groupby('流量级别')['访客数','支付金额'].sum().reset_index()

在这里插入图片描述

4.2.2 agg函数

agg函数能够让groupby分组更加灵活,实现分组后多种汇总运算:

df.groupby('流量级别')[['支付转化率','客单价']].agg({'mean','sum'})

在这里插入图片描述
agg中指定了mean和sum两种统计方式,在按流量级别分组之后,分别汇总计算了支付转化率、客单价的平均值和求和。

agg还可以对不同的字段采用不同的汇总方式,例如我们想要计算每种流量级别分组下,访客数的最大值,支付金额的中位数,也可以用一行代码实现:

df.groupby('流量级别').agg({'访客数':'max','支付金额':'median'})

在这里插入图片描述

4.3 切分

切分(分桶)操作常用于一维数组的分类和打标,cut函数能够高效的完成任务。它的主要参数和用法如图
在这里插入图片描述
以案例数据为例,每个渠道都有对应的访客数,我们现在希望对各渠道访客级别进行评估,按照访客数大小,分成忽略级(访客数100以内的)、百级、千级和万级的渠道:

df['分类打标'] = pd.cut(x = df['访客数'],bins = [0,100,1000,10000,100000],
                    right = False,labels = ['忽略级','百级','千级','万级'])

在这里插入图片描述

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐