加入两个 Pandas DataFrame 时防止重复列
当两个数据框具有相同名称的列并且在 JOIN 语句中未使用这些列时,通常会发生列重复。在本文中,让我们讨论在连接两个数据帧时可以防止列重复的三种不同方法。
句法:
pandas.merge(left, right, how=’inner’, on=None, left_on=None, right_on=None)
解释:
- left - 必须从左侧连接的数据框
- right - 必须从右侧连接的数据框
- how - 指定连接的类型。左、右、外、内、十字
- on – 用于连接两个数据框的列名。
- left_on – 要加入左侧 DataFrame 的列名。
- right_on - 要加入右侧 DataFrame 的列名。
通常合并:
当我们使用“inner”类型的 pd.merge()函数连接数据集时,输出将在两个数据帧的相同列上附加前缀和后缀,如输出所示。
Python3
# 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)
Python3
# 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)
Python3
# 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)
Python3
# 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')
输出:
方法一:在join语句中使用同名列
在这种防止重复列加入两个数据帧的方法中,用户只需要使用 pd.merge()函数并在使用内部联接和要加入的列名加入时传递其参数来自Python中的左右数据帧。
例子:
在这个例子中,我们首先使用 pd.DataFrame函数创建一个示例数据框 data1 和 data2,然后使用 pd.merge()函数通过内连接连接两个数据框,并明确提及要成为的列名从左右数据帧加入。
Python3
# 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()函数作为参数传递,如下所示,以从最终数据帧中删除所有重复项。
下降()函数:
此函数用于从行或列中删除指定的标签。
句法:
DataFrame.drop(self, labels=None, axis=0, index=None, columns=None, level=None, inplace=False, errors=’raise’)
参数:
- 标签:要删除的索引或列标签。
- axis:是否从索引(0 或“索引”)或列(1 或“列”)中删除标签。 {0 或“索引”、1 或“列”}
- index:指定轴的替代方案(标签,axis=0 等价于 index=labels)。
- columns:指定轴的替代方法(标签,axis=1 等价于 columns=labels)。
- level:对于 MultiIndex,标签将被删除的级别。
- 就地:如果为真,则就地执行操作并返回无。
- 错误:如果“忽略”,则抑制错误并且仅删除现有标签。
例子:
在此示例中,我们使用 pd.merge()函数通过内连接来连接两个数据帧。现在,为两个数据框中具有相同名称的新连接列添加一个名为“remove”的后缀。使用 drop()函数删除后缀为“remove”的列。这将确保新数据框中不存在相同的列。
Python3
# 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语言中的独特之处。
差分函数:
此函数返回一个集合,其中包含两个集合之间的差异。
句法:
set.difference(set)
参数:
- set :用于检查差异的集合
例子:
在这个例子中。我们正在使用差异函数从给定的数据帧中删除相同的列,并进一步将具有唯一列的数据帧存储为新的数据帧。现在,使用 pd.merge()函数将左侧数据框与使用“内部”连接的唯一列数据框连接起来。这将确保合并数据集中没有列重复。
Python3
# 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')
输出: