【问题标题】:How do I combine_first, indexing specific column two DataFrames into one?如何组合_first,将特定列的两个 DataFrame 索引为一个?
【发布时间】:2018-04-07 03:13:47
【问题描述】:

按 c 列映射后, 如果 A 列有值,则插入 A 列的值;如果没有,请插入 B 列。

data1                               data2

a    b    c                      a    c    d
a1   b1   c1                     1a   c1   1d   
     b2   c2                     2a   c2   2d
a3        c3                     3a   c3   3d
                                 4a   c4   4d

我想要的结果

  result
   a    b   c     
   a1   b1  c1
   2a   b2  c2
   a3       c3

我尝试了以下,但我并不满意。

->>> result = data1.merge(data2, on=['c'])
Prefixes _x and _y are created. combine_first is not applied.

->>> result = data1.combine_first(data2)
It is not mapped by column c.

如何获得好的结果? 我请求你的帮助。 谢谢

【问题讨论】:

    标签: python pandas dataframe path-combine


    【解决方案1】:

    使用@IdoS 设置:

    import pandas as pd
    data1 = pd.DataFrame({'a': ['a1', None, 'a3'],
                          'b': ['b1', 'b2', None],
                          'c': ['c1', 'c2', 'c3']})
    
    data2 = pd.DataFrame({'a': ['1a', '2a', '3a', '4a'],
                          'c': ['c1', 'c2', 'c3', 'c4'],
                          'd': ['1d', '2d', '3d', '4d']})
    

    您可以使用set_indexcombine_first 和重新索引:

    df_out = data1.set_index('c').combine_first(data2.set_index('c'))\
         .reindex(data1.c)\
         .reset_index()
    
    df_out
    

    输出:

        c   a     b   d
    0  c1  a1    b1  1d
    1  c2  2a    b2  2d
    2  c3  a3  None  3d
    

    【讨论】:

    • 非常感谢
    【解决方案2】:

    我不是 100% 清楚你是如何索引你的数据框(data1data2),但如果你在列 'c' 上索引它们应该可以工作。

    这就是我创建您的数据的方式:

    import pandas as pd
    data1 = pd.DataFrame({'a': ['a1', None, 'a3'],
                          'b': ['b1', 'b2', None],
                          'c': ['c1', 'c2', 'c3']})
    
    data2 = pd.DataFrame({'a': ['1a', '2a', '3a', '4a'],
                          'c': ['c1', 'c2', 'c3', 'c4'],
                          'd': ['1d', '2d', '3d', '4d']})
    

    然后我将两者的索引设置为列'c'

    data1 = data1.set_index('c')
    data2 = data2.set_index('c')
    

    然后我像你一样使用combine_first

    data_combined = data1.combine_first(data_2)
    

    我明白了:

        a   b   d
    c           
    c1  a1  b1  1d
    c2  2a  b2  2d
    c3  a3  None    3d
    c4  4a  NaN 4d
    

    不知道为什么你不想要索引为'c4' 或列'd' 的行,但删除它们很容易:

    data_combined = data_combined.drop('d', axis=1)
    data_combined = data_combined.loc[data_combined.index != 'c4']
    

    然后我重新排序以获得您想要的结果:

    data_combined = data_combined.reset_index()
    data_combined = data_combined[['a', 'b', 'c']]
    data_combined = data_combined.fillna('')
    
    
        a   b   c
    0   a1  b1  c1
    1   2a  b2  c2
    2   a3      c3
    

    【讨论】:

    • 非常感谢
    【解决方案3】:

    你也可以试试这个方法:

    # set indexes
    data1 = data1.set_index('c')
    data2 = data2.set_index('c')
    
    # join data on indexes
    datax = data1.join(data2.drop('d', axis=1), rsuffix='_rr').reset_index()
    
    # fill missing value in column a
    datax['a'] = datax['a'].fillna(datax['a_rr'])
    
    # drop unwanted columns
    datax.drop('a_rr', axis=1, inplace=True)
    
    # fill missing values with blank spaces
    datax.fillna('', inplace=True)
    
    # output
        a   b   c
    0   a1  b1  c1
    1   2a  b2  c2
    2   a3      c3
    

    # data used
    data1 = pd.DataFrame({'a':['a1','','a3'],
                          'b':['b1','b2',''],
                          'c':['c1','c2','c3']})
    
    data2 = pd.DataFrame({'a':['1a','2a','3a','4a'],
                          'c':['c1','c2','c3','c4'],
                          'd':['1d','2d','3d','4d']})
    

    【讨论】:

    • 非常感谢
    猜你喜欢
    • 2017-09-02
    • 2018-04-08
    • 2021-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-10
    • 2020-05-03
    • 1970-01-01
    相关资源
    最近更新 更多