避免合并无效的最佳方法



假设我有那两个pandas dataframes。

In [3]: df1 = pd.DataFrame({'id':[None,20,None,40,50],'value':[1,2,3,4,5]})
In [4]: df2 = pd.DataFrame({'index':[None,20,None], 'value':[1,2,3]})
In [7]: df1
Out[7]:      id  value
        0   NaN      1
        1  20.0      2
        2   NaN      3
        3  40.0      4
        4  50.0      5
In [8]: df2
Out[8]:    index  value
        0    NaN      1
        1   20.0      2
        2    NaN      3

当我合并这些dataframes(基于ID和索引列)时 - 结果包括ID和索引缺少值的行。

df3 = df1.merge(df2, left_on='id', right_on = 'index', how='inner')
In [9]: df3
Out[9]:      id  value_x  index  value_y
        0   NaN        1    NaN        1
        1   NaN        1    NaN        3
        2   NaN        3    NaN        1
        3   NaN        3    NaN        3
        4  20.0        2   20.0        2

那是我尝试的,但我想这不是最好的解决方案:

我用一个dataframe列中的某些值代替了所有缺失值,在第二个数据框中相同,但具有另一个值 - 目的是条件将返回false,而行将不在结果中。

In [14]: df1_fill = df1.fillna({'id':'NONE1'})
In [13]: df2_fill = df2.fillna({'index':'NONE2'})
In [15]: df1_fill
Out[15]:       id  value
         0  NONE1      1
         1     20      2
         2  NONE1      3
         3     40      4
         4     50      5
In [16]: df2_fill
Out[16]:    index  value
         0  NONE2      1
         1     20      2
         2  NONE2      3    

该问题的最佳解决方案是什么?

在示例中 - 连接列的Daya类型是数字的,但它可以是另一种类型,例如文本或日期...

编辑:

因此,在这里的解决方案中,我可以使用dropna函数在加入之前将丢失值的行删除 - 但这是很好的内在加入,我根本不希望这些行。

左联接或完整加入呢?

假设我有以前使用过的两个数据框 - df1,df2。

因此,对于内部和左联接,我真的可以使用dropna函数:

In [61]: df_inner = df1.dropna(subset=['id']).merge(df2.dropna(subset=['index']), left_on='id', right_on = 'index', how='inner')
In [62]: df_inner
Out[62]:      id  value_x  index  value_y
         0  20.0        2   20.0        6
In [63]: df_left = df1.merge(df2.dropna(subset=['index']), left_on='id', right_on = 'index', how='left')
In [64]: df_left
Out[64]:      id  value_x  index  value_y
         0   NaN        1    NaN      NaN
         1  20.0        2   20.0      6.0
         2   NaN        3    NaN      NaN
         3  40.0        4    NaN      NaN
         4  50.0        5    NaN      NaN
In [65]: df_full = df1.merge(df2, left_on='id', right_on = 'index', how='outer')
In [66]: df_full
Out[66]:      id  value_x  index  value_y
         0   NaN        1    NaN      5.0
         1   NaN        1    NaN      7.0
         2   NaN        3    NaN      5.0
         3   NaN        3    NaN      7.0
         4  20.0        2   20.0      6.0
         5  40.0        4    NaN      NaN
         6  50.0        5    NaN      NaN

在左边,我从"右"数据框中删除了缺失值行,然后使用了Merge。

没关系,因为在左加入中,您知道,如果条件返回false,您在右源列中有null-因此,行真的存在还是jusr返回falses。

都没关系。

,但是要获得完整的加入 - 我需要两个来自两个来源的行...

我不能使用dropna,因为它会给我带来我需要的行,如果我不使用它 - 我遇到了错误的结果。

谢谢。

为什么不做这样的事情:

pd.merge(df1.dropna(subset=['id']), df2.dropna(subset=['index']), 
                                    left_on='id',right_on='index', how='inner')

输出:

id  value_x index   value_y
0   20.0    2   20.0    2

如果您不想要NAN值,则可以删除NAN值,即

df3 = df1.merge(df2, left_on='id', right_on = 'index', how='inner').dropna()

df3 = df1.dropna().merge(df2.dropna(), left_on='id', right_on = 'index', how='inner')

输出:

     id  value_x  index  value_y
0  20.0        2   20.0        2

合并后的外部合并下降。

df_full = df1.merge(df2, left_on='id', right_on = 'index', how='outer').dropna(subset = ['id'])

输出:

     id  value_x  index  value_y
4  20.0        2   20.0      2.0
5  40.0        4    NaN      NaN
6  50.0        5    NaN      NaN

由于您正在进行'内部'加入,因此您可以做的是在合并之前将id列为NAN的DF1中。

df1_nonan = df1.dropna(subset = ['id'])
df3 = df1_nonan.merge(df2, left_on='id', right_on = 'index', how='inner')

相关内容

  • 没有找到相关文章

最新更新