- inner merge——关联列名一致:pd.merge()与dataframe.merge()
- pd.merge():查找两个DataFrame之间通用的列,然后,将匹配的行组合成新表中的行;
- 除了次之外,每个DataFrame都有自己的merge方法;且当我们需要将两个以上的DataFrame连接在一起时,我们选择这种“链接”方法
#两表联合
new_df = pd.merge(orders, customers)
new_df = orders.merge(customers)
#多表联合
big_df = orders.merge(customers).merge(products)
- inner merge——关联的列名不一致
实际情况中,每张表中都可能有一个id命名的列,但是当我们想要关联两张表时,并不是想通过id这个字段关联,这个时候直接使用.merge()就有可能出现问题,所以需要我们重新命名id,方法有两种:
- 使用.rename({‘c1’:‘c2’})
- 使用关键字left_on并right_on指定我们要执行合并的列。返回id_x和id_y;为了友好阅读可以使用suffixes重新定义后缀x和y
** 之前的dataframe展示的时候,只会出现一次联建列;但是现在的情况由于没有重新命名,所以生成dataframe的时候就会有两个id列,数据会通过id_x和id_y来区别
import pandas as pd
orders = pd.read_csv('orders.csv')
products = pd.read_csv('products.csv')
# 在orders和products两张表中都有id;
# orders表中和products表相关联的列名实际上是:orders表中的products_id和products表中的id
# 所以我们将products表中的id重新命名
orders_products = pd.merge(
orders,
products.rename(columns={'id':'product_id'})
)
# 在orders和customers两张表中都有id;
# orders表中和products表相关联的列名实际上是:orders表中的customer_id和customers表中的id
# 所以根据表的顺序,分别定义需要联合的列名
# 但是新dataframe展示的是id_x和id_y,使用suffixes=['_order', '_customer']定义后缀xy
pd.merge(
orders,
customers,
left_on='customer_id',
right_on='id',
suffixes=['_order', '_customer']
)
----------------------------------------------------------------------------
id_x customer_id product_id quantity timestamp id_y customer_name address phone_number
1 2 3 1 2017-01-01 00:00:00 2 Jane Doe 456 Park Ave 949-867-5309
2 2 2 3 2017-01-01 00:00:00 2 Jane Doe 456 Park Ave 949-867-5309
3 3 1 1 2017-01-01 00:00:00 3 Joe Schmo 789 Broadway 112-358-1321
id_order customer_id product_id quantity timestamp id_customer customer_name address phone_number
1 2 3 1 2017-01-01 00:00:00 2 Jane Doe 456 Park Ave 949-867-5309
2 2 2 3 2017-01-01 00:00:00 2 Jane Doe 456 Park Ave 949-867-5309
3 3 1 1 2017-01-01 00:00:00 3 Joe Schmo 789 Broadway 112-358-1321
- Outer Join
如果我们想要合并两张数据而不会丢失其中一个表中缺少的数据,我们可以使用 “外部联接”
- pd.merge(company_a, company_b, how=‘outer’):会将两表中,所有没有重叠的数据都重新展示
- pd.merge(company_a, company_b, how=‘left’):只将company_a没有被覆盖的数据展示出来
- pd.merge(company_a, company_b, how=“right”):只将company_b没有被覆盖的数据展示出来
- 连接dataframe
数据通常被拆分为多个CSV文件,这时需要从多个较小的DataFrame重建单个DataFrame,使用方法:pd.concat([df1, df2, df2, …])
** 仅当所有DataFrame中的所有列都相同时,此方法才有效
import pandas as pd
bakery = pd.read_csv('bakery.csv')
print(bakery)
ice_cream = pd.read_csv('ice_cream.csv')
print(ice_cream)
menu=pd.concat([bakery,ice_cream])
print(menu)