将值的第一个实例从一个数据帧拉到另一个数据帧

2024-06-16 12:27:38 发布

您现在位置:Python中文网/ 问答频道 /正文

题目不太好,所以我试着描述一下我要找的东西。 如果您想先看到一些代码,这是可行的,但需要的时间太长(我的df“Test”的长度是22e6行)

此df为“测试”:

    SA      DATE        MTRCYCCD
0   123     2015-07-31  H
1   123     2015-12-27  H
2   123     2015-06-09  H
3   123     2015-07-01  H
4   123     2015-12-28  H

此数据框为“meterread”:

    Serial  KWH_DEC_2014    KWH_JAN_2015 
0   B       11/24/2014      12/24/2014
1   C       11/25/2014      12/26/2014
2   D       11/26/2014      12/29/2014
3   F       12/1/2014       12/30/2014
4   H       12/2/2014       12/31/2014

此df为“第16项”:

    SA_ID   MTRCYCCD    DA_DEC_2014  DA_JAN_2015
0   123     H           BUNDLED      NaN
1   123     H           BUNDLED      NaN         
2   123     H           BUNDLED      NaN
3   123     H           BUNDLED      NaN

我希望输出文件是“Test”中的一个新列:

    SA      DATE        MTRCYCCD  LSE
0   123     2015-07-31  H         BUNDLED
1   123     2015-12-27  H         BUNDLED
2   123     2015-06-09  H         BUNDLED
3   123     2015-07-01  H         BUNDLED
4   123     2015-12-28  H         BUNDLED

这是我当前的代码(工作正常,但速度非常慢):

Test['LSE'] = ''
for i in range(len(Test)): 
    t = (meterread[meterread['Serial'] == Test.iloc[i,2]] > Test.iloc[i,1]).iloc[:,1:]
    Item16col = t.columns[t.values.argmax()]
    row = (Item16.index[Item16.iloc[:,0] == Test.iloc[i,0]])
    col = Item16.columns.get_loc('DA_'+Item16col.lstrip('KWH_'))
    Test.iloc[i,3] = Item16.iloc[row,col].values
    print(Test.iloc[i,3],Item16.iloc[row,col].values)

我知道我犯了一些错误,特别是在数据帧中循环行。这就是我需要帮助的地方--我怎样才能矢量化,或者以其他方式提高代码的速度

代码执行以下操作: 1.在“meterread”中查找与“Test”中日期的第一个实例相对应的列索引,该实例位于“meterread”的日期(对于该MTRCYCCD)之间。 2.拉出列名,去掉KWH\并替换为DA\。将此分配给“col” 3.在“Item16”中找到与“Test”中的SA\u ID匹配的行。 4.使用这些行和列从“Item16”中提取特定月份的DA状态。捆扎、NaN或其他。 5.将DA状态分配给“Test”中的新列,标记为LSE

正如我所说,代码可以工作,但它需要很长的时间(22e6行!真的,乘以3)


Tags: 代码testdfsacolnandakwh