Pandas为什么会在NaN上合并

Pandas为什么会在NaN上合并

在本文中,我们将介绍Pandas在进行合并操作时为什么会出现 NaN 的情况。Pandas是一种用于数据分析的开源Python库,它能够灵活地处理和操作大型数据集。Pandas中的merge和join操作是将两个或多个数据集合并为一个数据集的最常用方法之一。然而,在这个过程中,一些数据集中的存在NaN值可能会导致奇怪的合并结果,这也导致了一些对这个问题的混淆和质疑。

阅读更多:Pandas 教程

为什么会出现NaN?

NaN代表“Not a Number”,在许多情况下,它是一个错误或非法的值,例如,数据被删除或转换错误。当我们使用Pandas进行数据分析和操作时,我们经常需要处理缺失值,而NaN就是最常见的一种情况。Pandas提供一些方法来处理NaN值,例如,fillna,dropna,或使用Pandas的插值方法进行数据填充等。

在进行数据集合并时,如果左右两个数据集中的列中有NaN值,那么在合并时,这些NaN值充当“特殊”值,称为“缺失值指示器”。缺失值指示器是一个标志,用于指示某个值是否为NaN。在Pandas中,缺失值指示器默认为NaN。例如:

import pandas as pd

df1 = pd.DataFrame({'key': ['A', 'B', 'C', 'D'],
                    'value1': [1, 2, 3, 4]})
df2 = pd.DataFrame({'key': ['A', 'B', 'C', 'D'],
                    'value2': [5, np.nan, 7, 8]})

merged_df = pd.merge(df1, df2, on='key')
print(merged_df)
Python

输出:

  key  value1  value2
0   A       1     5.0
1   B       2     NaN
2   C       3     7.0
3   D       4     8.0
Python

在这个例子中,两个数据集都有一个相同的 ‘key’ 列。df1 中的 ‘key’ 列没有 NaN 值,而 df2 中的 ‘key’ 列有一个 NaN 值。 在合并期间,Pandas使用“缺失值指示器”把 NaN 值进行了合并,将 df2 中的缺失值赋值给了新数据集中的空值。

DataFrame.merge() 的参数

在 DataFrame.merge() 方法中有几个参数可以对 NaN 值的合并产生影响。

how

DataFrame.merge()方法默认how值为 inner,表示使用相同的键(在左侧和右侧 DataFrame 中找到)进行 join。如果一个键的值仅在一个 DataFrame 中出现,则不包括该键的行。

  • Inner join:两边的数据集只包括共同存在的键的行。df1 和 df2 中都有 ‘key’ 值 ‘A’, ‘B’, ‘C’, ‘D’,所以合并之后只有这四个键的值被包括在新的数据集中。
  • Left join:使用左侧 DataFrame 中的所有键,将右侧 DataFrame 的行与左侧 DataFrame 中的键对齐。右侧 DataFrame 中没有完全对应于左侧的键的行添加 NaN 值。例如,如果使用左链接合并 df1 和 df2,则新的数据集将包括 df1 中的所有键,以及 df2 中的 ‘key’ 列,但是如果 df2 中的 ‘key’ 列没有 df1 中的 ‘E’,则 ‘value2’ 将被保留为 NaN。
  • Right join:使用右侧 DataFrame 中的所有键,将左侧 DataFrame 的行与右侧 DataFrame 中的键对齐。左侧 DataFrame 中没有完全对应右侧的键的行添加 NaN 值。例如,如果使用右链接合并 df1 和 df2,则新的数据集将包括 df2 中的所有键,以及 df1 中的 ‘key’ 列,但是如果 df1 中的 ‘key’ 列没有 df2 中的 ‘E’,则 ‘value1’ 将被保留为 NaN。
  • Outer join:使用左侧和右侧 DataFrame 中的所有键,将行组合在一起。如果一个键的值仅在一个 DataFrame 中出现,则添加 NaN 值。合并之后的数据集包括 df1 和 df2 中所有的 ‘key’ 值,其中 df1 中没有的 ‘value2’ 列的值为 NaN,df2 中没有的 ‘value1’ 列的值也为 NaN。

on

‘on’ 参数指定进行合并操作的列或列。如果两个数据集中,指定的列名不同,则可以使用 left_on 和 right_on 参数来指定。如果没有指定on参数,则会自动使用两个数据集中共同的列来进行合并。

import pandas as pd

df1 = pd.DataFrame({'key1': ['A', 'B', 'C', 'D'],
                    'value1': [1, 2, 3, 4]})
df2 = pd.DataFrame({'key2': ['A', 'B', 'C', 'D'],
                    'value2': [5, 6, 7, 8]})

merged_df = pd.merge(df1, df2, left_on='key1', right_on='key2')
print(merged_df)
Python

输出:

  key1  value1 key2  value2
0    A       1    A       5
1    B       2    B       6
2    C       3    C       7
3    D       4    D       8
Python

suffixes

如果两个数据集中有重复列名,那么 merge() 方法将自动添加一个后缀 ‘_x’ 和 ‘_y’,以区分这些列。

import pandas as pd

df1 = pd.DataFrame({'key': ['A', 'B', 'C', 'D'],
                    'value': [1, 2, 3, 4]})
df2 = pd.DataFrame({'key': ['A', 'B', 'C', 'D'],
                    'value': [5, 6, 7, 8]})

merged_df = pd.merge(df1, df2, on='key', suffixes=('_left', '_right'))
print(merged_df)
Python

输出:

  key  value_left  value_right
0   A          1            5
1   B          2            6
2   C          3            7
3   D          4            8
Python

总结

在 Pandas 进行数据合并时,NaN 值常常会出现。DataFrame.merge() 方法提供了一些参数,用于控制合并操作中 NaN 值的处理方式。我们在使用 merge() 方法时需要根据具体的情况选择合适的参数,以获得正确的合并结果。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

登录

注册