【问题标题】:How to combine (merge) two datatable Frame in python如何在python中组合(合并)两个数据表Frame
【发布时间】:2020-08-18 17:34:37
【问题描述】:

给定两个datatable Frame。如何将它们组合(合并)在一帧中?

dt_f_A =

+--------+--------+--------+-----+--------+ | A_at_1 | A_at_2 | A_at_3 | ... | A_at_m | +--------+--------+--------+-----+--------+ | v_1 | | | | | +--------+--------+--------+-----+--------+ | ... | | | | | +--------+--------+--------+-----+--------+ | v_N | | | | | +--------+--------+--------+-----+--------+

dt_f_B =

+--------+--------+--------+-----+--------+ | B_at_1 | B_at_2 | B_at_3 | ... | B_at_k | +--------+--------+--------+-----+--------+ | w_1 | | | | | +--------+--------+--------+-----+--------+ | ... | | | | | +--------+--------+--------+-----+--------+ | w_N | | | | | +--------+--------+--------+-----+--------+

预期结果(dt_f_A concat(combine or merge) dt_f_B)

+--------+--------+--------+-----+--------+------- -+--------+--------+-----+--------+ | A_at_1 | A_at_2 | A_at_3 | ... | A_at_m | B_at_1 | B_at_2 | B_at_3 | ... | B_at_k | +--------+--------+--------+-----+--------+------- -+--------+--------+-----+--------+ | v_1 | | | | | w_1 | | | | | +--------+--------+--------+-----+--------+------- -+--------+--------+-----+--------+ | ... | | | | | ... | | | | | +--------+--------+--------+-----+--------+------- -+--------+--------+-----+--------+ | v_N | | | | | w_N | | | | | +--------+--------+--------+-----+--------+------- -+--------+--------+-----+--------+

我们考虑三种情况:

案例 1: a) 两帧的行数完全相同完全相同b)列中的独特属性

案例2:行数不同

案例3:属性不唯一(有重复)

@sammywemmy 感谢您的宝贵意见。

【问题讨论】:

    标签: python dataframe concatenation py-datatable


    【解决方案1】:

    案例 1: a) 两帧的行数完全相同完全相同b)列中的独特属性

    1- 使用 cbind : dt_f_A.cbind(dt_f_B)

    2-使用:dt_f_A[:,dt_f_B.names] = dt_f_B

    例子:

    import datatable as dt
    
    dt_f_A = dt.Frame({"a":[1,2,3,4],"b":['a','b','c','d']})
    dt_f_B = dt.Frame({"c":[1.1, 2.2, 3.3, 4.4], "d":['aa', 'bb', 'cc', 'dd']})
    
    dt_f_A.cbind(dt_f_B)
    
    #dt_f_A[:, dt_f_B.names] = dt_f_B # it's work fine also
    
    print(dt_f_A)
    

    案例2: 行数不同

    • dt_f_A.cbind(dt_f_B) 给出 InvalidOperationError: Cannot cbind frame with X rows to a frame with Y rows。 (X≠Y)
    • dt_f_A[:, dt_f_B.names] 给出 ValueError: Frame 有 X 行,并且不能在需要 Y 的表达式中使用。 (X≠Y)

    解决方法:使用dt_f_A.cbind(dt_f_B,force=True)

    例子:

    import datatable as dt
    
    dt_f_A = dt.Frame({"a":[1, 2, 3, 4, 5,6], "b":['a', 'b', 'c', 'd', 'e','f']})
    dt_f_B = dt.Frame({"c":[1.1, 2.2, 3.3, 4.4], "d":['aa', 'bb', 'cc', 'dd']})
    
    dt_f_A.cbind(dt_f_B,force=True)
    
    print(dt_f_A)
    

    缺失的值,则用NA

    填充

    案例3: 属性不唯一(有重复)

    • dt_f_A.cbind(dt_f_B) :它有效并发出警告。它将重复的属性更改为唯一的属性:atatableWarning: Duplicate column name found, and was assigned a unique name: 'a' -> 'a.0'

    • dt_f_A[:, dt_f_B.names] = dt_f_B:IT 没有给出任何错误。它消除了 dt_f_A 中的重复列,并保留了 dt_f_B 中的列。

    例子:

    import datatable as dt
    
    dt_f_A = dt.Frame({"a":[1,2,3,4],"b":['a','b','c','d']})
    dt_f_B = dt.Frame({"a":[1.1, 2.2, 3.3, 4.4], "d":['aa', 'bb', 'cc', 'dd']})
    
    dt_f_A.cbind(dt_f_B) # rename the duplicated columns
    #dt_f_A[:, dt_f_B.names] = dt_f_B # keep only the duplicated columns in dt_f_B
    
    print(dt_f_A)
    

    @sammywemmy 感谢您的宝贵意见 :)

    【讨论】:

    • 请注意,要使其工作,它们应该具有相同的行数,并且列中的值是唯一的;这里的假设是您确定每列中的行数和值的唯一性(没有重复)
    • @sammywemmy ,非常感谢您的宝贵意见。我也更改了问题和答案以涵盖这三种情况。另外,我在主要答案和问题中感谢您。再次感谢您。
    猜你喜欢
    • 2019-03-19
    • 1970-01-01
    • 2015-08-05
    • 2019-04-28
    • 1970-01-01
    • 2015-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多