📜  加入两个 Pandas DataFrame 时防止重复列

📅  最后修改于: 2022-05-13 01:55:32.664000             🧑  作者: Mango

加入两个 Pandas DataFrame 时防止重复列

当两个数据框具有相同名称的列并且在 JOIN 语句中未使用这些列时,通常会发生列重复。在本文中,让我们讨论在连接两个数据帧时可以防止列重复的三种不同方法。

句法:

解释:

  • 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()函数作为参数传递,如下所示,以从最终数据帧中删除所有重复项。

下降()函数:

此函数用于从行或列中删除指定的标签。

句法:

参数:

  • 标签:要删除的索引或列标签。
  • 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')

输出: