数据分析之Pandas合并操作总结

↑↑↑关注后"星标"Datawhale每日干货 & 每月组队学习,不错过
 Datawhale干货 
作者:耿远昊,Datawhale成员,华东师范大学
pandas 是一个强大的分析结构化数据的工具集,它的使用基础是Numpy(提供高性能的矩阵运算),用于数据挖掘和数据分析,同时也提供数据清洗功能。Pandas做分析数据,可以分为索引、分组、变形及合并四种操作。前边已经介绍过索引操作、分组操作及变形操作,最后对Pandas中的合并操作进行介绍,涉及知识点提纲如下图:     本文目录
              1. append与assign                  1.1. append方法                  1.2. assign方法2. combine与update    2.1. combine方法    2.2. update方法              3. concat方法                4. merge与join    4.1. merge函数    4.2. join函数在详细讲解每个模块之前,首先读入数据:
import numpy as np
import pandas as pd
df = pd.read_csv('joyful-pandas-master/data/table.csv')
df.head()

append与assign

1. append方法(一般用来添加行)

(1)利用序列添加行(必须指定name)

df_append = df.loc[:3,['Gender','Height']].copy()  # 默认深拷贝
df_append

s = pd.Series({'Gender':'F','Height':188},name='new_row')  # name定义增加的这一行索引名。
df_append.append(s)

(2)用DataFrame添加表

df_temp = pd.DataFrame({'Gender':['F','M'],'Height':[188,176]})
df_append.append(df_temp)

从上面可以看到这个索引是不会自动往下续的,因为我们新建的df_temp如下:

pd.DataFrame({'Gender':['F','M'],'Height':[188,176]})

可以看到这个索引就是0和1,如果你直接append而不加参数则就会直接将上面的DataFrame直接和df_append粘在一起而不会改变索引,那么怎么改变索引使得这个索引顺着前面的索引呢?看下面的例子:

df_append.append(df_temp, ignore_index=True)

下面是这个append函数的原形式:

DataFrame.append(self,other,ignore_index=False,verify_integrity=False,sort=False)

其中的ignore_index就是表示是否要跟着前面的索引来定义后面的索引,一般来说是默认False,也就是像我们的第一个例子这样。现在我们将这个参数改成True,就可以顺着索引了,就像上面的这个例子一样。

当然这里也可以自行改变索引名:

df_temp = pd.DataFrame({'Gender':['F','M'],'Height':[188,176]},index=['new_1','new_2'])
df_append.append(df_temp)

其他的参数学习可以参考这个网站:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.append.html?highlight=append#pandas.DataFrame.append

2. assign方法(一般用来添加列)

该方法主要用于添加列,列名直接由参数指定:

s = pd.Series(list('abcd'),index=range(4))
df_append.assign(Letter=s)  # 这里定义列名就直接在assign参数定义。

这个一般定义要添加的列Series是没有列索引名的:

s = pd.Series(list('abcd'),index=range(4))
s

可以一次添加多个列:
df_append.assign(col1=lambda x:x['Gender']*2, col2=s)

可以看出这个可以添加任意多个列,但是都是要在参数中依次定义的。

参考学习:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.assign.html?highlight=assign#pandas.DataFrame.assign

combine与update

1. combine方法

combine和update都是用于表的填充函数,可以根据某种规则填充。
(1)填充对象
可以看出combine方法是按照表的顺序轮流进行逐列循环的,而且自动索引对齐,缺失值为NaN,理解这一点很重要。
df_combine_1 = df.loc[:1,['Gender','Height']].copy()
df_combine_2 = df.loc[10:11,['Gender','Height']].copy()
df_combine_1.combine(df_combine_2,lambda x,y:print(x))

因为lambda函数是输出x和y,没有返回值所以都为NaN。

df1 = pd.DataFrame({'A': [5, 0], 'B': [2, 4]})
df2 = pd.DataFrame({'A': [1, 1], 'B': [3, 3]})
df1.combine(df2, np.minimum)

combine函数原型:

DataFrame.combine(self,other:'DataFrame',func,fill_value = None,overwrite = True)

这里通过多个例子尝试可以发现,func函数是必不可少的,也就是我们必须有一个func来返回数值。

(2)一些例子
例①:根据列均值的大小填充
df1 = pd.DataFrame({'A': [1, 2], 'B': [3, 4]})
df2 = pd.DataFrame({'A': [8, 7], 'B': [6, 5]})
df1.combine(df2,lambda x,y:x if x.mean()>y.mean() else y)

例②:索引对齐特性(默认状态下,后面的表没有的行列都会设置为NaN)

df2 = pd.DataFrame({'B': [8, 7], 'C': [6, 5]},index=[1,2])
df1.combine(df2,lambda x,y:x if x.mean()>y.mean() else y)

例③:使得df1原来符合条件的值不会被覆盖

df1.combine(df2,lambda x,y:x if x.mean()>y.mean() else y,overwrite=False)

例④:在新增匹配df2的元素位置填充-1

df1.combine(df2,lambda x,y:x if x.mean()>y.mean() else y,fill_value=-1)
# 也就是将Na
  • 6
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值