笔记|数据分析之pandas基础----聚合与合并(一)

数据合并

层次化索引

层次化索引让你能在一个轴上拥有多个索引级别。
层次化索引我个人理解是对索引进行了分组,比方说一部分数据是今年的,一部分数据是明年的,可通过层次化索引进行切块以方便后续选取数据

In [263]: data = Series(np.random.randn(10), index=[['2010','2010','2010','2011','2011','2011','2012','2012','2013','2013'],[
     ...: 1, 2, 3, 1, 2, 3, 1, 2, 2, 3]])  # 这种形式叫做带有```MultiIndex```索引的格式化输出形式。

In [264]: data
Out[264]:
2010  1    1.739760
      2   -1.685753
      3    0.046604
2011  1   -0.580861
      2   -1.848230
      3    0.148327
2012  1    0.552871
      2    1.347311
2013  2   -0.555054
      3    0.601366
dtype: float64

选取分好组的数据:

In [265]: data['2010']
Out[265]:
1    1.739760
2   -1.685753
3    0.046604
dtype: float64

In [267]: data.loc[['2010','2011']]
Out[267]:
2010  1    1.739760
      2   -1.685753
      3    0.046604
2011  1   -0.580861
      2   -1.848230
      3    0.148327
dtype: float64

重塑层次化索引

重塑相当于是把一个带有层次化索引的Series转换成了DataFrame,或者把DataFrame转换成带有层次化索引的Series

In [269]: data.unstack()
Out[269]:
             1         2         3
2010  1.739760 -1.685753  0.046604
2011 -0.580861 -1.848230  0.148327
2012  0.552871  1.347311       NaN
2013       NaN -0.555054  0.601366
In [280]: data.unstack().stack()
Out[280]:
2010  1    1.739760
      2   -1.685753
      3    0.046604
2011  1   -0.580861
      2   -1.848230
      3    0.148327
2012  1    0.552871
      2    1.347311
2013  2   -0.555054
      3    0.601366
dtype: float64

对于DataFrame来说,每条轴都可以有分层索引

In [36]: frame = DataFrame(np.arange(12).reshape(4,3),index=[['a','a','b','b'],[1,2,1,2]],columns=[
    ...: ['Ohio','Ohio','Colorado'],['Green','Red','Green']])

In [37]: frame
Out[37]:
     Ohio     Colorado
    Green Red    Green
a 1     0   1        2
  2     3   4        5
b 1     6   7        8
  2     9  10       11

有了分部的列索引,选取列分组会十分轻松:

In [38]: frame['Ohio']
Out[38]:
     Green  Red
a 1      0    1
  2      3    4
b 1      6    7
  2      9   10

数据库DataFrame合并

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

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

In [72]: df1
Out[72]:
  key  data1
0   b      0
1   b      1
2   a      2
3   c      3
4   a      4
5   a      5
6   b      6

数据库DataFrame合并在未指定合并列的情况下会默认会将键名相同的列进行合并,如例子中的key。合并之后会取两组数据中的交集,其他的会被清除。

当然我们也可以指定合并列

In [77]: pd.merge(df1,df2,on='key')  #指定了key列为合并项
Out[77]:
  key  data1  data2
0   b      0      1
1   b      1      1
2   b      6      1
3   a      2      0
4   a      4      0
5   a      5      0

合并默认是交集,肯定也可以改为并集

In [82]: pd.merge(df1,df2, how='outer')
Out[82]:
  key  data1  data2
0   b    0.0    1.0
1   b    1.0    1.0
2   b    6.0    1.0
3   a    2.0    0.0
4   a    4.0    0.0
5   a    5.0    0.0
6   c    3.0    NaN
7   d    NaN    2.0

除了交集与并集,还有左连接与右连接统称为多对多合并

多对多合并

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

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

In [85]: df1
Out[85]:
  key  data1
0   b      0
1   b      1
2   a      2
3   c      3
4   a      4
5   b      5

In [86]: df2
Out[86]:
  key  data2
0   a      0
1   b      1
2   a      2
3   b      3
4   d      4

因为多对多连接会产生行的笛卡尔积,所以结果会跟交集并集不同,类似于这样。

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

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

In [41]: pd.merge(df1,df2,on='key',how='left')
Out[41]:
   key  data1  data2
0    b      0    1.0
1    b      0    3.0
2    b      1    1.0
3    b      1    3.0
4    a      2    0.0
5    a      2    2.0
6    c      3    NaN
7    a      4    0.0
8    a      4    2.0
9    b      5    1.0
10   b      5    3.0

同样这里产生了笛卡尔积,它的合并规则如下图所示,由于how=left,也就是data1为主目标向data2合并,图片中例举了b这个键是如何合并的。左边有3个b,右边有2个,左右相同的键进行一一合并后就产生了6个b。同样a就会产生4个,而c在右边没有相同的所以只有一个。

WechatIMG32.png

不同的连接类型:


WechatIMG33.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,277评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,689评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,624评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,356评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,402评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,292评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,135评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,992评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,429评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,636评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,785评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,492评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,092评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,723评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,858评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,891评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,713评论 2 354

推荐阅读更多精彩内容