pandas 结合两个 dfs:如果任一 df 在该索引处具有空值,则不保留

Posted

技术标签:

【中文标题】pandas 结合两个 dfs:如果任一 df 在该索引处具有空值,则不保留【英文标题】:pandas combine two dfs: leave none if either df has null value at that index 【发布时间】:2017-06-08 06:35:41 【问题描述】:

我想以这样的方式组合两个数据帧,如果对于其中一个 df,索引处的值为 null,它应该保留 null 值。例如,在下面的 df_combine 代码中,yyy 列的索引 0 处,它应该保留 np.nan。

df1= pd.DataFrame.from_dict('xxx':['ind',np.nan,'ind'],'yyy':[np.nan,'pin','din'], orient='columns')
    >>df1
       xxx  yyy
    0  ind  NaN
    1  NaN  pin
    2  ind  din

df2= pd.DataFrame.from_dict('xxx':['0.12','0.15','0.18','8.1'],'yyy':['9.2','1.1',np.nan,'7.1'], orient='columns')
    >>df2
        xxx  yyy
    0  0.12  9.2
    1  0.15  1.1
    2  0.18  NaN
    3   8.1  7.1

期望的输出:

 >>df_combine
             xxx       yyy
    0    ind||0.12   np.nan
    1     np.nan     pin||1.1
    2    ind||0.18     din

【问题讨论】:

请查看我的编辑。我添加了我想要的输出。 【参考方案1】:

IIUC 你可以这样做:

In [92]: df1.add('||').add(df2.values)
Out[92]:
         xxx       yyy
0  ind||0.12       NaN
1        NaN  pin||1.1
2  ind||0.18       NaN

设置:

In [86]: df1= pd.DataFrame.from_dict('xxx':['ind',np.nan,'ind'],'yyy':[np.nan,'pin','din'], orient='columns')

In [87]: df2= pd.DataFrame.from_dict('xxx':['0.12','0.15','0.18'],'yyy':['9.2','1.1',np.nan], orient='columns')

In [88]: df1
Out[88]:
   xxx  yyy
0  ind  NaN
1  NaN  pin
2  ind  din

In [89]: df2
Out[89]:
    xxx  yyy
0  0.12  9.2
1  0.15  1.1
2  0.18  NaN

更新:

In [126]: df1.add('||').add(df2.iloc[:len(df1)].values)
Out[126]:
         xxx       yyy
0  ind||0.12       NaN
1        NaN  pin||1.1
2  ind||0.18       NaN

【讨论】:

绝妙的解决方案。我不知道添加。如果仅在两个具有不同维度的 dfs 上工作,我本可以接受这个答案,而我的真实数据就是这种情况。假设我在 df2 中再添加一行,它将不起作用。我已经修改了我原来的问题。 @Rtut,你想要的数据集呢?还是一样吗? 如果对某人有用。对于我的实际数据,我做了类似的事情来包括基于索引的搜索。我仍在测试它的效果如何。 df2_subset= df2.loc[df1.index] , df1.add('||').add(df2_subset.values)

以上是关于pandas 结合两个 dfs:如果任一 df 在该索引处具有空值,则不保留的主要内容,如果未能解决你的问题,请参考以下文章

在 Pandas 中连接两个 dfs

pandas:合并/concat.join 两个 dfs

如果在 Pandas 的任一列中找到,则删除两个 float64 值

使用自定义名称将多个pandas DataFrame输出为CSV

合并具有时间容差的 pandas 时间序列

Pandas Dataframe 合并 2 列,包括条件 If 合并:如果 df_2 中的日期在 df_1 中的其他两个日期之间