1

我有一个 X 数据框,

DT_X = dt.Frame({
    
    'date':['2020-09-01','2020-09-02','2020-09-03'],
    'temp':[35.3,32.9,43.2]
    
})
Out[4]: 
   | date        temp
-- + ----------  ----
 0 | 2020-09-01  35.3
 1 | 2020-09-02  32.9
 2 | 2020-09-03  43.2

[3 rows x 2 columns]

另一个数据框 Y 为,

DT_Y = dt.Frame({
    
    'stop_date' : ['2020-08-01','2020-09-01','2020-09-03','2020-09-07'],
    'is_arrested':[True,False,False,True]
    
})
Out[6]: 
   | stop_date   is_arrested
-- + ----------  -----------
 0 | 2020-08-01            1
 1 | 2020-09-01            0
 2 | 2020-09-03            0
 3 | 2020-09-07            1

[4 rows x 2 columns]

现在我想对 X 和 Y 执行 JOIN 操作,因为我应该在 X 数据帧上分配一个键,

DT_X.key='date'
Out[8]: 
date       | temp
---------- + ----
2020-09-01 | 35.3
2020-09-02 | 32.9
2020-09-03 | 43.2

[3 rows x 2 columns]

接下来我将 X 和 Y 加入为 ,

DT_Y[:,:,join(DT_X)]

在这里它抛出一个错误,

In [9]: DT_Y[:,:,join(DT_X)]                                                                                                                                                                      
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-9-a3bc1690fb98> in <module>
----> 1 DT_Y[:,:,join(DT_X)]

ValueError: Key column `date` does not exist in the left Frame

当然DT_Y 中不存在日期,它的列名为stop_date

在这种情况下如何执行连接操作??即列名不匹配。

注意

解决此问题的方法是将 DT_Y 的列名更改为

DT_Y.names = {'stop_date':'date'}

DT_Y[:,:,join(DT_X)]

加入的 DT 可以被视为,

Out[11]: 
   | date        is_arrested  temp
-- + ----------  -----------  ----
 0 | 2020-08-01            1  NA  
 1 | 2020-09-01            0  35.3
 2 | 2020-09-03            0  43.2
 3 | 2020-09-07            1  NA  

[4 rows x 3 columns]

这是预期的输出:

Out[13]: 
   | stop_date   is_arrested  temp
-- + ----------  -----------  ----
 0 | 2020-08-01            1  NA  
 1 | 2020-09-01            0  35.3
 2 | 2020-09-03            0  43.2
 3 | 2020-09-07            1  NA  

[4 rows x 3 columns]

4

1 回答 1

2

目前,join()仅支持在两个框架中使用相同的列名,请参阅文档了解更多详细信息。但是,有一个未解决的问题需要改进连接功能/API。

同时,如果您不想重命名列,可以执行以下操作

DT_Y_date = DT_Y[:, {"date":f[0], "is_arrested":f[1]}]
DT_YX_joined = DT_Y_date[:, :, join(DT_X)]

然后,DT_YX_joined将有您正在寻找的数据

   | date        is_arrested  temp
-- + ----------  -----------  ----
 0 | 2020-08-01            1  NA  
 1 | 2020-09-01            0  35.3
 2 | 2020-09-03            0  43.2
 3 | 2020-09-07            1  NA 

你甚至可以做一个像

DT_YX_joined = DT_Y[:, {"date":f[0], "is_arrested":f[1]}][:, :, join(DT_X)]

但它可能不够可读。还要注意,这里没有创建数据副本,只是更改了列名。

于 2020-09-09T21:22:34.413 回答