1. pd.concat()【数据合并】
1.1 源数据
def make_df(indexs, columns):
data = [[str(j) + str(i) for j in columns] for i in indexs]
df = pd.DataFrame(data=data, index=indexs, columns=columns)
return df
df1 = make_df([1, 2], list('AB'))
df2 = make_df([3, 4], list('AB'))
df3 = make_df([1, 2, 3, 4], list('ABCD'))
df4 = make_df([2, 3, 4, 5], list('BCDE'))
1.2 上下合并
pd.concat([df1, df2], axis=0)
1.3 左右合并
pd.concat([df1, df2], axis=1)
1.4 outer外连接 并集 补NaN
pd.concat([df3, df4], join='outer')
1.5 inner内连接 交集 取公共部分
pd.concat([df3, df4], join='inner')
2.pd.merge()【数据合并】
2.1 源数据
# 类似于MySQL中表和表直接的合并
# merge与concat的区别在于,merge需要依据某一共同的行或列来进行合并
# 使用pd.merge()合并时,会自动根据两者相同columns名称的那一列,作为key来进行合并
# 每一列元素的顺序不要求一致
df1 = pd.DataFrame(
{
'name': ['张三', '李四', '王五'],
'age': [22, 33, 44],
'id': [1, 2, 3]
}
)
df2 = pd.DataFrame(
{
'id': [2, 3, 4],
'sex': ['男', '女', '男'],
'job': ['Saler', 'CEO', 'Programer']
}
)
df3 = pd.DataFrame(
{
'name': ['张三', '李四', '王五'],
'age': [22, 33, 44],
'id': [1, 2, 2]
}
)
df4 = pd.DataFrame(
{
'id': [2, 3, 4],
'sex': ['男', '女', '男'],
'job': ['Saler', 'CEO', 'Programer']
}
)
df5 = pd.DataFrame(
{
'name': ['张三', '李四', '王五'],
'age': [22, 33, 44],
'id': [1, 2, 2]
}
)
df6 = pd.DataFrame(
{
'id': [2, 2, 4],
'sex': ['男', '女', '男'],
'job': ['Saler', 'CEO', 'Programer']
}
)
2.2 合并,只取交集【一对一】
pd.merge(df1, df2)
2.3 合并,只取交集【一对多】
pd.merge(df3, df4)
2.4 合并,只取交集【多对多】
pd.merge(df3, df4)
3.key()的规范化
# 当两个及以上的DataFrame合并时,有多列相同时使用
# on():当两边的列名一致时使用
# left_on()、right_one():当两边的列名不一致时使用
3.1 源数据
df1 = pd.DataFrame(
{
'id': [1, 2, 3],
'name': ['张三', '李四', '王五'],
'age': [22, 33, 44]
}
)
df2 = pd.DataFrame(
{
'id': [2, 3, 4],
'name': ['张三', '李四', '王五'],
'job': ['Saler', 'CEO', 'Programer']
}
)
3.2 合并时多列名称相同,需要指定一列作为连接的字段
pd.merge(df1, df2, on='id')
pd.merge(df1, df2, on='name')
3.3 如果没有相同的列名,则需要使用left_on、right_on来分别指出2个表中的不同列作为连接的字段
df1 = pd.DataFrame(
{
'id': [1, 2, 3],
'name': ['张三', '李四', '王五'],
'age': [22, 33, 44]
}
)
df2 = pd.DataFrame(
{
'id2': [2, 3, 4],
'sex': ['男', '女', '男'],
'job': ['Saler', 'CEO', 'Programer']
}
)
pd.merge(df1, df2, left_on='id', right_on='id2')
3.4 当左边的列和右边的index相同的时候,使用right_index=True作为连接字段
df1 = pd.DataFrame(
{
'id': [1, 2, 3],
'name': ['张三', '李四', '王五'],
'age': [22, 33, 44]
}
)
df2 = pd.DataFrame(
{
'id2': [2, 3, 4],
'sex': ['男', '女', '男'],
'job': ['Saler', 'CEO', 'Programer']
}
)
pd.merge(df1, df2, left_index=True, right_index=True)
3.5 左边的索引与右边的id2列进行连接,取交集
pd.merge(df1, df2, left_index=True, right_on='id2')
4. 合并方式
4.1 源数据
df1 = pd.DataFrame(
{
'id': [1, 2, 3],
'name': ['张三', '李四', '王五'],
'age': [22, 33, 44]
}
)
df2 = pd.DataFrame(
{
'id': [2, 3, 4],
'sex': ['男', '女', '男'],
'job': ['Saler', 'CEO', 'Programer']
}
)
4.2 默认是内连接 inner join,how='inner’默认
pd.merge(df1, df2, how='inner')
4.3 外合并:how=‘outer’:补NaN
pd.merge(df1, df2, how='outer')
4.4 左合并、右合并:how=‘left’,how=‘right’
pd.merge(df1, df2, how='left')
pd.merge(df1, df2, how='right')
5. 列冲突的解决
# 当列冲突时,即有多个列名称相同时,需要使用on=来指定哪一个列作为key,配合suffixes指定冲突列名
# 可以使用suffixes=自己指定后缀
# 相当于自定义名称冲突的列,在冲突的列后面增加一个后缀
5.1 源数据
df1 = pd.DataFrame(
{
'id': [1, 2, 3],
'name': ['张三', '李四', '王五'],
'age': [22, 33, 44]
}
)
df2 = pd.DataFrame(
{
'id': [2, 3, 4],
'name': ['男', '女', '男'],
'job': ['Saler', 'CEO', 'Programer']
}
)
5.2 列冲突的解决
pd.merge(df1, df2, on='id', suffixes=['_df1', '_df2'])