Python 使用 Pandas concat、merge和join dataframe

 以下是在Python中的Pandas中进行合并、连接和连接的不同方式和方法:

Python Pandas 中的 DataFrame concat()

concat() 函数负责执行沿轴的连接操作的所有繁重工作,同时对其他轴上的索引(如果有)执行可选的集合逻辑(并集或交集)。在此示例中,创建了三个具有相同的列但不同索引的DataFrame(df1df2和)。使用时,这些Pandas DataFrame非常重要,从而生成一个组合DataFrame,其中每个原始DataFrame中的行相互连通。df3pd.concat()

  • Python3
 
# Creating first dataframe
df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
                    'B': ['B0', 'B1', 'B2', 'B3'],
                    'C': ['C0', 'C1', 'C2', 'C3'],
                    'D': ['D0', 'D1', 'D2', 'D3']},
                   index=[0, 1, 2, 3])
 
# Creating second dataframe
df2 = pd.DataFrame({'A': ['A4', 'A5', 'A6', 'A7'],
                    'B': ['B4', 'B5', 'B6', 'B7'],
                    'C': ['C4', 'C5', 'C6', 'C7'],
                    'D': ['D4', 'D5', 'D6', 'D7']},
                   index=[4, 5, 6, 7])
 
# Creating third dataframe
df3 = pd.DataFrame({'A': ['A8', 'A9', 'A10', 'A11'],
                    'B': ['B8', 'B9', 'B10', 'B11'],
                    'C': ['C8', 'C9', 'C10', 'C11'],
                    'D': ['D8', 'D9', 'D10', 'D11']},
                   index=[8, 9, 10, 11])
 
# Concatenating the dataframes
pd.concat([df1, df2, df3])

显示:      ABCD 

0 A0 B0 C0 D0 
1 A1 B1 C1 D1
2 A2 B2 C2 D2
3 A3 B3 C3 D3
4 A4 B4 C4 D4
5 A5 B5 C5 D5
6 A6 B6 C6 D6
7 A7 B7 C7 D7
8 A8 B8 C8 D8
9 A9 B9 C9 D9
10 A10 B10 C10 D10
11 A11 B11 C11 D11

Python 中 Pandas 的 Python merge()

DataFrames 合并 Pandas 提供了一个单一的函数,merge(),DataFrame 对象之间所有标准数据库连接操作的入口点。这里示例中,创建了两个 DataFrames(left和),它们有一个共同的键列“Key”该函数使用内连接根据它们的共同“Key”列合并这些DataFrame,从而生成一个组合DataFrame,其中仅包含两个DataFrame中键值匹配的行。rightpd.merge()

  • Python3
 
# Dataframe created
left = pd.DataFrame({'Key': ['K0', 'K1', 'K2', 'K3'],
                     'A': ['A0', 'A1', 'A2', 'A3'],
                     'B': ['B0', 'B1', 'B2', 'B3']})
 
right = pd.DataFrame({'Key': ['K0', 'K1', 'K2', 'K3'],
                      'C': ['C0', 'C1', 'C2', 'C3'],
                      'D': ['D0', 'D1', 'D2', 'D3']})
 
# Merging the dataframes
pd.merge(left, right, how='inner', on='Key')

显示:

  键 ABCD 
0 K0 A0 B0 C0 D0
1 K1 A1 B1 C1 D1
2 K2 A2 B2 C2 D2
3 K3 A3 B3 C3 D3

左合并

pd.merge()函数how='left'执行左连接,将leftDataFrame与right“Key”上的DataFrame合并。DataFrame中的所有行都left将被保留,并且rightDataFrame中的匹配行将附加其各自的值。

  • Python3
 
left_merged = pd.merge(left, right, how='left', on='Key')
print(left_merged)

显示:

  键 ABCD 
0 K0 A0 B0 C0 D0
1 K1 A1 B1 C1 D1
2 K2 A2 B2 C2 D2
3 K3 A3 B3 C3 D3

右合并

pd.merge()函数how='right'执行右连接,将leftDataFrame与right“Key”上的DataFrame合并。DataFrame中的所有行都right将被保留,并且leftDataFrame中的匹配行将附加其各自的值。

  • Python3
 
right_merged = pd.merge(left, right, how='right', on='Key')
print(right_merged)

显示:

  键 ABCD 
0 K0 A0 B0 C0 D0
1 K1 A1 B1 C1 D1
2 K2 A2 B2 C2 D2
3 K3 A3 B3 C3 D3

外部合并

函数pd.merge()执行how='outer'外连接,将leftDataFrame与right“Key”列上的DataFrame完全合并。这将生成一个包含leftrightDataFrame中所有行的DataFrame,并在没有匹配项的位置用NaN填充恢复值。

  • Python3
 
outer_merged = pd.merge(left, right, how='outer', on='Key')
print(outer_merged)

显示:

  键 ABCD 
0 K0 A0 B0 C0 D0
1 K1 A1 B1 C1 D1
2 K2 A2 B2 C2 D2
3 K3 A3 B3 C3 D3

Python Pandas 中的 DataFrames join()

在此示例中,leftrightDataFrames均使用键“K0”、“K1”、“K2”和“K3”进行索引。该操作根据其索引合并DataFrames,根据共享索引将中的列“A”和“B”与中的列“C”和“D”left.join(right)合并leftright

  • Python3
 
left = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
                     'B': ['B0', 'B1', 'B2', 'B3']},
                    index=['K0', 'K1', 'K2', 'K3'])
 
right = pd.DataFrame({'C': ['C0', 'C1', 'C2', 'C3'],
                      'D': ['D0', 'D1', 'D2', 'D3']},
                     index=['K0', 'K1', 'K2', 'K3'])
 
# Joining the dataframes
left.join(right)

输出

     ABCD 
K0 A0 B0 C0 D0
K1 A1 B1 C1 D1
K2 A2 B2 C2 D2
K3 A3 B3 C3 D3
 

对比总结:

从高层次来看:

  • .concat()只需将多个DataFrame垂直堆叠在一起,或者在索引对齐后水平缝合
  • .merge()首先对齐两个DataFrame' 选定的公共列或索引,然后从每个对齐的行中挑选剩余的列DataFrame

进一步来说,.concat()

  • 是顶级 pandas 函数
  • DataFrame 垂直或水平组合两个或多个熊猫
  • 水平组合时仅对齐索引
  • 当任何一个DataFrame包含重复索引时就会出错。
  • 默认为外连接,可选择内连接

.merge()

  • 既作为顶级 pandas 函数存在,又作为DataFrame方法存在(从 pandas 1.0 开始)
  • DataFrame水平方向精确合并两个
  • 将调用方DataFrame的列或索引与其他方 DataFrame的列或索引对齐
  • 通过执行笛卡尔积来处理连接列或索引上的重复值
  • 默认为内连接,有左、外、右选项

请注意,执行时pd.merge(left, right),如果left有两行包含来自连接列或索引的相同值,则每行将与right相应的行合并,从而产生笛卡尔积。另一方面,如果.concat()用于合并列,我们需要确保在任一中都不存在重复的索引DataFrame

从实际情况来看:

  • .concat()同质组合时先考虑DataFrame.merge()互补组合时先考虑DataFrame
  • 如果需要垂直合并,则使用.concat()。如果需要通过列水平合并,则使用.merge(),默认情况下会在共同的列上进行合并。

 

posted @ 2024-07-23 17:35  gaussen126  阅读(1)  评论(0编辑  收藏  举报