问题描述
给出两个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(合并或合并)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感谢您的宝贵意见。
解决方法
案例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:无法将X行的框架绑定到Y行的框架。 (X≠Y) -
dt_f_A[:,dt_f_B.names]
给出ValueError:框架有 X 行,因此不能在需要 Y 的表达式中使用。 (X≠Y)
解决方案:使用dt_f_A.cbind(dt_f_B,force=True)
示例:
import datatable as dt
dt_f_A = dt.Frame({"a":[1,4,5,6],'d','e','f']})
dt_f_B = dt.Frame({"c":[1.1,'dd']})
dt_f_A.cbind(dt_f_B,force=True)
print(dt_f_A)
缺少的值,然后用 NA
填充情况3: 属性不是唯一的(重复)
-
dt_f_A.cbind(dt_f_B)
:它起作用并发出警告。它将重复的属性更改为唯一属性:atatableWarning:找到重复的列名称,并为其分配了唯一的名称:'a'->'a.0' -
dt_f_A[:,dt_f_B.names] = dt_f_B
:它没有给出任何错误。它将消除 dt_f_A 中重复的列,并将该列保留在 dt_f_B 中。
示例:
import datatable as dt
dt_f_A = dt.Frame({"a":[1,'d']})
dt_f_B = dt.Frame({"a":[1.1,'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谢谢您的宝贵意见:)