【问题标题】:Pandas merging mixed length datasets without duplicate columns熊猫合并混合长度数据集而没有重复列
【发布时间】:2021-03-10 09:41:10
【问题描述】:

我正在尝试将几个混合数据帧(有时存在于其他数据帧中的一些缺失值)合并到一个组合数据集中,某些数据帧也可能包含额外的列,然后应该添加这些列,并且所有其他行都将 NaN 作为值。

这基于一列或几列,行索引没有意义,真正的数据集有很多列,因此手动删除任何内容都非常不理想。

因此,本质上,基于一列或多列合并多个数据帧,优先考虑任何非 NaN 值,或者如果存在两个冲突的非 NaN 值,则优先考虑基础数据帧中的现有值,而不是要合并的值。

df1 = pd.DataFrame({
    'id': [1, 2, 4],
    'data_one': [np.nan, 3, np.nan], 
    'data_two': [4, np.nan, np.nan], 
})
   id  data_one  data_two
0   1       NaN       4.0
1   2       3.0       NaN
2   4       NaN       NaN

df2 = pd.DataFrame({
    'id': [1, 3],
    'data_one': [8, np.nan], 
    'data_two': [np.nan, 4], 
    'data_three': [np.nan, 100]
})
   id  data_one  data_two  data_three
0   1       8.0       NaN         NaN
1   3       NaN       4.0       100.0


# Desired result
res = pd.DataFrame({
    'id': [1, 2, 3, 4],
    'data_one': [8, 3, np.nan, np.nan], 
    'data_two': [4, np.nan, 4, np.nan], 
    'data_three': [np.nan, np.nan, 100, np.nan], 
})
   id  data_one  data_two  data_three
0   1       8.0       4.0         NaN
1   2       3.0       NaN         NaN
2   3       NaN       4.0       100.0
3   4       NaN       NaN         NaN

到目前为止,我一直在尝试的功能是pd.merge()pd.join()pd.combine_first(),但都没有成功,可能遗漏了一些简单的东西。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    你可以做一个groupby()加上fillna()

    pd.concat([df1,df2]).groupby('id').apply(lambda x: x.ffill().bfill()).drop_duplicates()
    

    结果:

        id   data_one   data_two    data_three
    0   1    8.0        4.0         NaN
    1   2    3.0        NaN         NaN
    1   3    NaN        4.0         100.0
    2   4    NaN        NaN         NaN
    

    请注意,它将为 df1 和 df2 都具有非空值的位置返回单独的行。这是故意的,因为我不知道在这种情况下你想做什么。

    【讨论】:

    • 谢谢!这样就成功了,需要几个小时才能运行,但速度仍然足够快,无需多处理即可管理!
    猜你喜欢
    • 2019-12-15
    • 2017-11-26
    • 1970-01-01
    • 1970-01-01
    • 2017-11-13
    • 2016-08-20
    • 1970-01-01
    • 2014-12-04
    相关资源
    最近更新 更多