pandas数据整合

数据整合:聚合、合并、重塑

1.层次化索引(列和行都可以是层次化索引)

  data = pd.Series(np.random.randn(9),
               index=[['a', 'a', 'a', 'b', 'b', 'c', 'c', 'd', 'd'],
               [1, 2, 3, 1, 3, 1, 2, 2, 3]])
  data数据如下: (index第一个元素是外层索引,第二个元素是内层索引)
    a 1 -0.204708
      2  0.478943
      3 -0.519439
    b 1 -0.555730
      3  1.965781
    c 1  1.393406
      2  0.092908
    d 2  0.281746
      3  0.769023
 data.index.names = ['key1', 'key2']
 data['b']  # 获取外层索引是b的行数据
 data['b':'c']  # 获取外层索引从b到c的行数据(包括c)
 data.loc[['b', 'd']] # 获取外层索引是b和d的行数据
 data.loc[:, 2]   # 获取内层索引是2的行数据
 data.unstack()   # 将内层索引变为列索引(缺失值用NaN填充)
 data.unstack().stack()     # unstack的逆运算是stack

2. 重排和分级排序

 data.swaplevel('key1', 'key2')  # 将key1和key2索引层次互换,不修改原数据生成新数据
 data.swaplevel(0, 1).sort_index(level=0)
 data.sum(level='key2')  # 根据key2索引进行行求和统计
 data.sum(level='color', axis=1)  # 根据color索引进行列求和统计
 frame2 = frame.set_index(['c', 'd'])  # 将frame的c、d列作为索引(默认这两列不再是数据)
 frame.set_index(['c', 'd'], drop=False) # 作为索引的同时,不删除,保留作为数据
 frame2.reset_index()  # 将层次化索引转移到列里面去作为数据

3. 合并数据集

 pd.merge(df1, df2) # 默认是将df1和df2共有的列当做键来合并
 pd.merge(df1, df2, on='key') # 指定用key列当做键合并
 pd.merge(df3, df4, left_on='lkey', right_on='rkey') # 分别指定df3和df4列作为合并条件
默认情况下,merge是做的内连接inner,取交集(还有left/right/outer)
 pd.merge(df1, df2, how='outer') # 传入how改为外连接,取并集
 pd.merge(left, right, on='key1', suffixes=('_left', '_right')) # 有重复列名给列名加后缀区别(默认加_x,_y)
 pd.merge(left1, right1, left_on='key', right_index=True) # 传入 right_index=True表示用索引作为连接键合并(left_index或者两个都传也行)
 left2.join(right2, how='outer') # 默认用索引合并
 left1.join(right1, on='key') # 指明用key作为合并键
 left2.join([right2, another], how='outer') # 直接和dataframe合并(another是一个dataframe)

4.轴向连接

数据合并运算也被称作连接(concatenation)、绑定(binding)或堆叠(stacking)

  arr = np.arange(12).reshape((3, 4)) # 3乘4的多维数组(ndarry类型)
  np.concatenate([arr, arr], axis=1) # ndarry类型数据的合并(列数增加,行数不变,axis=1表示水平连接)
  np.concatenate([a,a]) # ndarry类型垂直连接

  pd.concat([s1, s2, s3]) # Series或者dataframe数据合并(默认行数增加,按列匹配拼接)

  pd.concat([s1, s2, s3], axis=1) # 按行匹配,列数拼接增加(axis=1表示水平连接)
  pd.concat([s1,s2],ignore_index = True) # 丢弃原有的索引,重新创建索引
  pd.concat([s1, s4], axis=1, join='inner') # 传入join参数将默认的outer连接改为inner连接
  result = pd.concat([s1, s1, s3], keys=['one','two', 'three']) # 为拼接的每一个数据集起一个外层索引名(axis=1时,keys表示给列取索引)
  pd.concat([s1, s4], axis=1, join_axes=[['a', 'c', 'b', 'e']]) # join_axes设置另外一轴的索引
  pd.concat([df1, df2], axis=1, keys=['level1', 'level2']) # 水平连接,给连接的两个数据集各取外层索引名level1和level2
  pd.concat({'level1': df1, 'level2': df2}, axis=1) # 水平连接,通过传递字典给数据集取外层索引名

  data = np.where(pd.isnull(a), b, a) # pandas三目运算:pd.isnull(a)真,那么返回b,否则返回a

  data = df1.combine_first(df2) # 将df2的数据填充到df1中缺失数据(对应位填充),df2比df1数据量更多,那就添加到df1中,返回新的df1,原来的df1不会改变

5.数据重塑和轴向旋转

 result = data.stack()  # 将列转换为行(一般转为行内层索引),Series没有stack方法
 result.unstack()  # 将行转换为列
 result.reindex(index=ilst('abcd')) # 重新定义行索引,返回一个新数据
 result.reindex(columns=ilst('abcd')) # 重新定义列索引,返回一个新数据
 data.pivot(index='userNum', columns='subjectCode', values='score') # 从data中重新组装数据,index为行索引,columns为列索引,values为填充数据,如果没定义values,则会将剩下未选中的所有列作为外层列索引重组数据
 data.pivot_table('prop', index='year',columns='sex', aggfunc=sum) # 从data数据集中取prop列作为运算数据,index作为行索引,columns作为列索引,aggfunc作为计算方法,没有值的用NaN填充(默认可以修改),可以写成下面形式:
 pd.pivot_table(data,values='prop', index='year',columns='sex', aggfunc=sum)

 pivot()将长数据集转换成宽数据集,melt()则是将宽数据集变成长数据集

 pd.melt(df, id_vars=['key'], value_vars=['A', 'B']) # 在df数据集中,id_vars指明的列保持不变,value_vars指明需要转换成variable列的值,对应生成value列的值:如下:

         df 数据集:
          A B C key
        0 1 4 7 foo
        1 2 5 8 bar
        2 3 6 9 baz

    data = pd.melt(df, id_vars=['key'], value_vars=['A', 'B'])
    data数据集:
      key variable value
    0 foo    A       1
    1 bar    A       2
    2 baz    A       3
    3 foo    B       4
    4 bar    B       5
    5 baz    B       6

如果不对id_vars或者value_vars做设置,默认会将其他所有列作为variable的值,这样只会有
三列,一列是默认的index行索引,一列是varable,一列是value

        pd.melt(df) : 
        
           variable value
        0       key   foo
        1       key   bar
        2       key   baz
        3         A     1
        4         A     2
        5         A     3
        6         B     4
        7         B     5
        8         B     6
        9         C     7
        10        C     8
        11        C     9

pd.melt(df, value_vars=['key', 'A', 'B'])

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

推荐阅读更多精彩内容