在连接两个Pandas数据框架时防止重复的列
当两个数据框架有相同名称的列,并且在JOIN语句中没有使用这些列时,通常会发生列的重复。在这篇文章中,让我们讨论三种不同的方法,我们可以在连接两个数据框架时防止列的重复。
语法:
pandas.merge(left, right, how=’inner’, on=None, left_on=None, right_on=None)
解释:
- left – 需要从左边连接的数据框架
- right – 必须从右边加入的数据框架
- how – 指定连接的类型:左、右、外、内、交叉
- on – 连接两个数据框架的列名。
- left_on – 在左边的数据框架中要连接的列名。
- right_on – 在右边的数据框架中要连接的列名。
正常合并:
当我们使用类型为’inner’的pd.merge()函数连接一个数据集时,输出将有前缀和后缀附加到两个数据框架上的相同列,如输出中所示。
# import python pandas package
import pandas as pd
# import the numpy package
import numpy as np
# Create sample dataframe data1 and data2
data1 = pd.DataFrame(np.random.randint(1000, size=(1000, 3)),
columns=['EMI', 'Salary', 'Debt'])
data2 = pd.DataFrame(np.random.randint(1000, size=(1000, 3)),
columns=['Salary', 'Debt', 'Bonus'])
# Merge the DataFrames
merged = pd.merge(data1, data2, how='inner', left_index=True,
right_index=True)
print(merged)
输出:
方法1:使用在连接语句中具有相同名称的列
在这种方法中,为了防止重复的列加入两个数据框架,用户只需要使用pd.merge()函数,并在加入时传递其参数,使用python中的内部连接和要加入的左右数据框架的列名。
示例:
在这个例子中,我们首先使用pd.DataFrame函数创建了一个样本数据框架data1和data2,如图所示,然后使用pd.merge()函数通过内联方式连接这两个数据框架,并明确提到要从左右数据框架上连接的列名。
# import python pandas package
import pandas as pd
# import the numpy package
import numpy as np
# Create sample dataframe data1 and data2
data1 = pd.DataFrame(np.random.randint(100, size=(1000, 3)),
columns=['EMI', 'Salary', 'Debt'])
data2 = pd.DataFrame(np.random.randint(100, size=(1000, 3)),
columns=['Salary', 'Debt', 'Bonus'])
# Merge the DataFrames
merged = pd.merge(data1, data2, how='inner',
left_on=['Salary', 'Debt'],
right_on=['Salary', 'Debt'])
print(merged)
输出:
方法2:通过提及列的明确后缀名来防止重复
在这个方法中,为了防止在连接两个不同的数据框架的列时出现重复,用户需要使用pd.merge()函数,该函数负责将数据框架的各列连接在一起,然后用户需要调用drop()函数,将所需的条件作为参数传递,如下图所示,将所有重复的数据从最终数据框架中删除。
drop() 函数:
该函数用于从行或列中删除指定的标签。
语法:
DataFrame.drop(self, labels=None, axis=0, index=None, columns=None, level=None, inplace=False, errors=’raise’)
参数:
- labels: 要删除的索引或列标签。
- axis: 是否从索引(0或’索引’)或列(1或’列’)中删除标签。{0或’索引’,1或’列’}。
- index: 替代指定轴(标签,axis=0相当于index=labels)。
- columns: 替代指定轴(标签,axis=1等同于columns=labels)。
- level: 对于MultiIndex来说,将删除标签的级别。
- inplace: 如果为真,就地进行操作并返回无。
- errors: 如果’忽略’,则抑制错误,只放弃现有的标签。
示例:
在这个例子中,我们使用pd.merge()函数通过内部连接来连接两个数据框架。现在,为新加入的、在两个数据框架中具有相同名称的列添加一个后缀’remove’。使用drop()函数来删除带有后缀’remove’的列。这将确保在新的数据框架中不存在相同的列。
# import python pandas package
import pandas as pd
# import the numpy package
import numpy as np
# Create sample dataframe data1 and data2
data1 = pd.DataFrame(np.random.randint(100, size=(1000, 3)),
columns=['EMI', 'Salary', 'Debt'])
data2 = pd.DataFrame(np.random.randint(100, size=(1000, 3)),
columns=['Salary', 'Debt', 'Bonus'])
# Merge the DataFrames
df_merged = pd.merge(data1, data2, how='inner', left_index=True,
right_index=True, suffixes=('', '_remove'))
# remove the duplicate columns
df_merged.drop([i for i in df_merged.columns if 'remove' in i],
axis=1, inplace=True)
print(merged)
输出:
方法3:在合并两列之前删除重复的列
在这个方法中,用户需要调用merge()函数,该函数将简单地连接数据框中的列,然后进一步调用difference()函数,从两个数据框中删除相同的列,保留python语言中的独特列。
Difference 函数:
这个函数返回一个包含两个集合之差的集合。
语法:
set.difference(set)
参数:
- 集合:要检查的集合的差异在
示例:
在这个例子中,我们使用difference函数从给定的数据框架中移除相同的列,并进一步将具有唯一列的数据框架存储为一个新的数据框架。现在,使用pd.merge()函数,使用 “内部 “连接将左边的数据框架与唯一列的数据框架连接起来。这将确保在合并后的数据集中没有重复的列。
# import python pandas package
import pandas as pd
# import the numpy package
import numpy as np
# Create sample dataframe data1 and data2
data1 = pd.DataFrame(np.random.randint(100, size=(1000, 3)),
columns=['EMI', 'Salary', 'Debt'])
data2 = pd.DataFrame(np.random.randint(100, size=(1000, 3)),
columns=['Salary', 'Debt', 'Bonus'])
# Find the columns that aren't in the first DataFrame
different_cols = data2.columns.difference(data1.columns)
# Filter out the columns that are different.
# You could pass in the df2[diff_cols]
# directly into the merge as well.
data3 = data2[diff_cols]
# Merge the DataFrames
df_merged = pd.merge(data1, data3, left_index=True,
right_index=True, how='inner')
输出: