如何在Python中合并合并两个数据表框架

问题描述

给出两个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-使用cbinddt_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谢谢您的宝贵意见:)