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
0 Comments