小蛇学python(15)pandas之数据合并

在python的pandas中,合并数据共有三种思路。

其一,关系型数据库模式的连接操作。

其二,沿轴将多个操作对象拼接在一起。

其三,对互有重复数据的处理与合并。

我们分别来进行介绍。

1. merge、join

先从一个简单的例子开始。

import pandas as pd
from pandas import DataFrame

df1 = DataFrame({'key' : ['b', 'b', 'a', 'c', 'a', 'a', 'b'],
                 'data1' : range(7)})

df2 = DataFrame({'key' : ['a', 'b', 'd'],
                 'data2' : range(3)})

df = pd.merge(df1, df2)
print(df1)
print(df2)
print(df)

image.png

这里,并没有指定要用哪个列进行连接,如果没有指定,就会默认将重叠列的列名当作连接键。这里连接的结果是按照笛卡儿积的逻辑实现的。在这个例子中表现不太明显,我们再看下一个例子。

import pandas as pd
from pandas import DataFrame

df1 = DataFrame({'key' : ['b', 'b', 'a', 'c', 'a', 'b'],
                 'data1' : range(6)})

df2 = DataFrame({'key' : ['a', 'b', 'a', 'b', 'd'],
                 'data2' : range(5)})

df = pd.merge(df1, df2, on='key', how='left')
print(df1)
print(df2)
print(df)

image.png

我们看到,表格1里有3个b,表格2里有2个b,所以最终合并的表格里就有6个b,这就是所谓的笛卡尔乘积。在这里我也用了参数on,它的作用就是指定两个表格按照哪一列合并。我也用了参数how,它所决定的是合并方式。一共有四种方式分别为inner、left、right、outer,分别代表取交集,取交集加上左边表格剩余部分,取交集加右边表格剩余部分,取并集。

其实,如果两个对象的列名不同,但是列里的内容相同,也是可以合并的。看下面这个例子。

import pandas as pd
from pandas import DataFrame

df1 = DataFrame({'lkey' : ['b', 'b', 'a', 'c', 'a', 'b'],
                 'data1' : range(6)})

df2 = DataFrame({'rkey' : ['a', 'b','d'],
                 'data2' : range(3)})

df = pd.merge(df1, df2, left_on='lkey', right_on='rkey')
print(df1)
print(df2)
print(df)

image.png

如果要根据多个键进行合并,传入一个由列名组成的列表即可。你可以这样理解,多个键形成一系列元组,并将其充当单个连接键。看下面这个例子。

import pandas as pd
from pandas import DataFrame

df1 = DataFrame({'key1' : ['foo', 'foo', 'bar'],
                 'key2' : ['one', 'two', 'one'],
                 'lval' : [1, 2, 3]})

df2 = DataFrame({'key1' : ['foo', 'foo', 'bar', 'bar'],
                 'key2' : ['one', 'one', 'one', 'two'],
                 'rval' : [4, 5, 6 ,7]})

df = pd.merge(df1, df2, on=['key1', 'key2'], how='outer')
print(df1)
print(df2)
print(df)

image.png

有一种很常见的情况,就是表格中的连接键位于索引中。看下面这个例子如何解决。

import pandas as pd
from pandas import DataFrame

df1 = DataFrame({'key' : ['a', 'b', 'a', 'a', 'b', 'c'],
                  'value' : range(6)})

df2 = DataFrame({'group_val' : [3.5, 7]},
                 index=['a', 'b'])

df = pd.merge(df1, df2, left_on='key', right_index=True)
print(df1)
print(df2)
print(df)

image.png

DataFrame还有一个join实例方法,它能更为方便得实现按索引合并。它还可以用于合并多个带有相同或者相似索引的DataFrame对象。

这里就举一个例子,因为这个方法比较简单。

import numpy as np
import pandas as pd
from pandas import DataFrame

frame1 = DataFrame({'length' : [1, 2, 3, 4, 5],
                    'price' : [12.33, 11.44, 33.21, 13.23, 33.62]},
                    index=['ball', 'pencil', 'pen', 'mug', 'ashtray'])
frame2 = DataFrame({'local' : ['uk', 'pland', 'china', 'japan'],
                    'color' : ['while', 'red', 'red', 'black']},
                    index=['pencil', 'pencil', 'ball', 'pen'])
print(frame1)
print(frame2)
frame1.join(frame2)
print(frame1)

image.png

需要注意的是,只用join时,两个表格除了索引不得有重复的列。

2. contact

默认情况下,concat是在axis=0上工作的。所谓轴,即是要么横着拼接,要么竖着拼接的意思。

比如想把2017年和2018年吉林大学在安徽省的专业招收人数情况横向拼接起来,就会用到concat。如下例子。

import pandas as pd

jilindaxue2018 = pd.read_csv('jilindaxue2018.csv')
jilindaxue2018_major = jilindaxue2018.loc[:, '专业']
jilindaxue2018_anhui = jilindaxue2018.loc[:, '安徽']

jilindaxue2017 = pd.read_csv('jilindaxue2017.csv')
jilindaxue2017_anhui = jilindaxue2017.loc[:, '安徽']

frame = [jilindaxue2018_major, jilindaxue2018_anhui, jilindaxue2017_anhui]
data = pd.concat(frame, axis=1)
data.columns = ['专业', '安徽2018', '安徽2017']
print(data)
data.to_csv('data.csv', index=False, encoding='gbk')

3. 合并重叠数据

还有一种情况,就是用参数对象中的数据为调用者对象的缺失数据打补丁。这里,我们就需要用到combine_first函数。

import pandas as pd
from pandas import DataFrame
import numpy as np


df1 = DataFrame({'a' : [1, np.nan, 5, np.nan],
                 'b' : [np.nan, 2, np.nan, 6],
                 'c' : range(2, 18, 4)})

df2 = DataFrame({'a' : [5, 4, np.nan, 3, 7],
                 'b' : [np.nan, 3, 4, 6, 8],})

print(df1)
print(df2)
df1.combine_first(df2)
print(df1)

image.png

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏儿童编程

儿童创造力教育与编程教育的碰撞——MIT雷斯尼克教授最新理论梗概

儿童编程教育已经在我国各一线二线城市疯狂出现,颇有“烂大街”的趋势。我们不禁要问很多很多问题:

21870
来自专栏儿童编程

一张图理清《梅花易数》梗概

学《易经》的目的不一定是为了卜卦,但是了解卜卦绝对能够让你更好地了解易学。今天用一张思维导图对《梅花易数》的主要内容进行概括,希望能够给学友们提供帮助。

31240
来自专栏儿童编程

声音功能让儿童编程更有创造性

导读:Scratch中声音功能非常强大,除了常规的音效,你甚至可以模拟各种乐器的各个发音、设置节拍、休止……如果你愿意,甚至可以用它创作一个交响乐。我们可以引导...

13540
来自专栏儿童编程

什么样的人生才是有意义的人生——没有标准的标准答案

【导读】其实我们可以跳出这个小圈圈去更加科客观地看一下这个世界。在夜晚的时候我们仰望天空,浩瀚的宇宙中整个地球只是一粒浮尘,何况地球上一个小小的人类?在漫长的历...

1.8K50
来自专栏Ken的杂谈

【系统设置】CentOS 修改机器名

17830
来自专栏haifeiWu与他朋友们的专栏

复杂业务下向Mysql导入30万条数据代码优化的踩坑记录

从毕业到现在第一次接触到超过30万条数据导入MySQL的场景(有点low),就是在顺丰公司接入我司EMM产品时需要将AD中的员工数据导入MySQL中,因此楼主负...

27640
来自专栏儿童编程

我不是算命先生,却对占卜有了疑惑——如何论证“占卜前提”的正确与否

事出有因,我对《周易》感兴趣了很多年。只是觉得特别有趣,断断续续学习了一些皮毛。这几天又偶然接触到了《梅花易数》,觉得很是精彩,将五行八卦天干地支都串联了起来。...

14610
来自专栏FSociety

SQL中GROUP BY用法示例

GROUP BY我们可以先从字面上来理解,GROUP表示分组,BY后面写字段名,就表示根据哪个字段进行分组,如果有用Excel比较多的话,GROUP BY比较类...

5.1K20
来自专栏儿童编程

天干地支五行八卦的对应关系

19090
来自专栏儿童编程

《动物魔法学校》儿童学编程Scratch之“外观”部分

导读:本文通过一个案例《动物魔法学校》来学习Scratch语言的“外观”部分。之后通过一系列其他功能的综合运用对作品功能进行了扩展。

18940

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励