merge()函数

left 参与合并的左侧DataFrame
right 参与合并的右侧DataFrame
how “inner”,“outer”,“left”,“rigth”其中之一,默认为“inner”
on 用于连接的列名
left_on 左侧DataFrame用作连接键的列
right_on 右侧DataFrame用作连接键的列
left_index 将左侧的行索引用作其连接键
right_index 将右侧的行索引用作其连接键
sort 字符串值元组,默认为True,在处理大数据集时,禁用该选项可获得更好的性能
suffixes 字符串值元组,用于追加到重叠列名的末尾,默认为(‘_x’,'_y')
copy 设置为False,可以在某些特殊情况下避免将数据复制到结果数据结构中,默认总是复制

创建2个DataFrame

import pandas as pd
df1 = pd.DataFrame({'key':list('bbaca'),'data1':range(5)})
print(df1)
df2 = pd.DataFrame({'key':['a', 'b', 'd'],'data2':range(3)})
print(df2)

#输出

key  data1
0   b      0
1   b      1
2   a      2
3   c      3
4   a      4
  key  data2
0   a      0
1   b      1
2   d      2

pd.merge()连接2个表,默认how是inner,并且会按相同的key字段进行合并,即等价于on=’key’

df3 = pd.merge(df1, df2, how='outer', on='key')
print(df3)

#输出

key  data1  data2
0   b    0.0    1.0
1   b    1.0    1.0
2   a    2.0    0.0
3   a    4.0    0.0
4   c    3.0    NaN
5   d    NaN    2.0

当两边字段合并字段不同时,可以使用left_join,right_join设置合并字段,设置left_index,right_index的值来使用索引连接。如这里使用的是df1的data1连接,使用df2的索引

df4 = pd.merge(df1, df2, left_on='data1', right_index=True)
print(df4)

#输出
key_x  data1 key_y  data2
0     b      0     a      0
1     b      1     b      1
2     a      2     d      2

可以发现,2个DataFrame都有key列,上述使用_x ,_y来区分,也可以通过suffixes来设置名字

df5 = pd.merge(df1, df2, left_on='data1', right_index=True, suffixes=('_df1', 'df2'))
print(df5)

#输出
key_df1  data1 keydf2  data2
0       b      0      a      0
1       b      1      b      1
2       a      2      d      2

concat()函数

pd.concat(
	objs, 
    axis=0,
    join='outer',
    ignore_index=False,
    keys=None,
    levels=None,
    names=None,
    verify_integrity=False,
    copy=True)


objs:Series,DataFrame或Panel对象的序列或映射,如果传递了dict,则排序的键将用作键参数

axis:{0,1,...},默认为0,也就是纵向上进行合并。沿着连接的轴。

join:{'inner','outer'},默认为“outer”。如何处理其他轴上的索引。outer为联合和inner为交集。

ignore_index:boolean,default False。如果为True,请不要使用并置轴上的索引值。结果轴将被标记为0,...,n-1。如果要连接其中并置轴没有有意义的索引信息的对象,这将非常有用。注意,其他轴上的索引值在连接中仍然受到尊重。

keys:序列,默认值无。使用传递的键作为最外层构建层次索引。如果为多索引,应该使用元组。

levels:序列列表,默认值无。用于构建MultiIndex的特定级别(唯一值)。否则,它们将从键推断。

names:list,default无。结果层次索引中的级别的名称。

verify_integrity:boolean,default False。检查新连接的轴是否包含重复项。这相对于实际的数据串联可能是非常昂贵的。

copy:boolean,default True。如果为False,请勿不必要地复制数据。

merge时左右连接,concat是上下连接

import pandas as pd
df1 = pd.DataFrame(
    {
        'A': ['A{}'.format(i) for i in range(0, 4)],
        'B': ['B{}'.format(i) for i in range(0, 4)],
        'C': ['C{}'.format(i) for i in range(0, 4)]
    }
)

df2 = pd.DataFrame(
    {
        'A': ['A{}'.format(i) for i in range(4, 8)],
        'B': ['B{}'.format(i) for i in range(4, 8)],
        'C': ['C{}'.format(i) for i in range(4, 8)]
    }
)


df3 = pd.DataFrame(
    {
        'A': ['A{}'.format(i) for i in range(8, 12)],
        'B': ['B{}'.format(i) for i in range(8, 12)],
        'C': ['C{}'.format(i) for i in range(8, 12)]
    }
)

frames = [df1, df2, df3]
result = pd.concat(frames)
print(result)

#输出
A    B    C
0   A0   B0   C0
1   A1   B1   C1
2   A2   B2   C2
3   A3   B3   C3
0   A4   B4   C4
1   A5   B5   C5
2   A6   B6   C6
3   A7   B7   C7
0   A8   B8   C8
1   A9   B9   C9
2  A10  B10  C10
3  A11  B11  C11

传入也可以是字典

frames = {"df1":df1, "df2":df2, "df3":df3}
result = pd.concat(frames)
print(result)

#输出
A    B    C
df1 0   A0   B0   C0
    1   A1   B1   C1
    2   A2   B2   C2
    3   A3   B3   C3
df2 0   A4   B4   C4
    1   A5   B5   C5
    2   A6   B6   C6
    3   A7   B7   C7
df3 0   A8   B8   C8
    1   A9   B9   C9
    2  A10  B10  C10
    3  A11  B11  C11

当axis等于1时,concat就是行对齐

df4 = pd.DataFrame(
    {
        'C': ['C{}'.format(i) for i in range(3, 9)],
        'E': ['E{}'.format(i) for i in range(3, 9)],
        'F': ['f{}'.format(i) for i in range(3, 9)]
    }
)

result = pd.concat([df1,df4],axis=1)
print(result)

join,当为inner时,取两表交集,outer时,取两表并集

result1 = pd.concat([df1,df4],axis=1, join='inner')
print(result1)

#输出
A   B   C   C   E   F
0  A0  B0  C0  C3  E3  f3
1  A1  B1  C1  C4  E4  f4
2  A2  B2  C2  C5  E5  f5
3  A3  B3  C3  C6  E6  f6

result2 = pd.concat([df1,df4],axis=1, join='outer')
print(result2)

#输出
A    B    C   C   E   F
0   A0   B0   C0  C3  E3  f3
1   A1   B1   C1  C4  E4  f4
2   A2   B2   C2  C5  E5  f5
3   A3   B3   C3  C6  E6  f6
4  NaN  NaN  NaN  C7  E7  f7
5  NaN  NaN  NaN  C8  E8  f8

append方法()类似于使用axis=0对齐

result3 = df1.append(df2)
print(result3)

#输出

A   B   C
0  A0  B0  C0
1  A1  B1  C1
2  A2  B2  C2
3  A3  B3  C3
0  A4  B4  C4
1  A5  B5  C5
2  A6  B6  C6
3  A7  B7  C7

如果两个表的index没有实际含义,使用ignore_index参数,置为True,会使用一个新的index

result4 = pd.concat([df1,df4],axis=1, ignore_index=True)
print(result4)

#输出
0    1    2   3   4   5
0   A0   B0   C0  C3  E3  f3
1   A1   B1   C1  C4  E4  f4
2   A2   B2   C2  C5  E5  f5
3   A3   B3   C3  C6  E6  f6
4  NaN  NaN  NaN  C7  E7  f7
5  NaN  NaN  NaN  C8  E8  f8

增加区分组键

result5 = pd.concat([df1, df2, df3],keys=['x', 'y', 'z'])

print(result5)

#输出
A    B    C
x 0   A0   B0   C0
  1   A1   B1   C1
  2   A2   B2   C2
  3   A3   B3   C3
y 0   A4   B4   C4
  1   A5   B5   C5
  2   A6   B6   C6
  3   A7   B7   C7
z 0   A8   B8   C8
  1   A9   B9   C9
  2  A10  B10  C10
  3  A11  B11  C11

也可以通过字典增加区分组键

result6 = pd.concat({'df1':df1, 'df2':df2, 'df3':df3})

print(result6)

#输出
A    B    C
df1 0   A0   B0   C0
    1   A1   B1   C1
    2   A2   B2   C2
    3   A3   B3   C3
df2 0   A4   B4   C4
    1   A5   B5   C5
    2   A6   B6   C6
    3   A7   B7   C7
df3 0   A8   B8   C8
    1   A9   B9   C9
    2  A10  B10  C10
    3  A11  B11  C11

加入新的行

s2 = pd.Series(['x0', 'x1', 'x2', 'x3'], index=['A', 'B', 'C', 'D'])
df5 = df1.append(s2, ignore_index=True)

print(df5)

#输出
A   B   C    D
0  A0  B0  C0  NaN
1  A1  B1  C1  NaN
2  A2  B2  C2  NaN
3  A3  B3  C3  NaN
4  x0  x1  x2   x3

加入新的列

dicts = [
    {'A':1, 'B':2, 'C':3, 'X':4},
    {'A':5, 'B':6, 'C':7, 'Y':8}
]
df6 = df1.append(dicts, ignore_index=True)

print(df6)
A   B   C    X    Y
0  A0  B0  C0  NaN  NaN
1  A1  B1  C1  NaN  NaN
2  A2  B2  C2  NaN  NaN
3  A3  B3  C3  NaN  NaN
4   1   2   3  4.0  NaN
5   5   6   7  NaN  8.0
Categories: python

0 Comments

发表评论

Avatar placeholder

邮箱地址不会被公开。 必填项已用*标注