标题不是很好,所以我将尽力描述我要寻找的内容。 如果您想先看一些代码,可以使用它,但是会花费太长的时间(我的df“测试”的长度为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
此df是“读表”:
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为“ Item16”:
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
我希望输出文件成为“测试”中的新列:
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”中找到与“测试”中的SA_ID与SA匹配的行。 4.使用这些行和列从“ Item16”中提取该特定月份的DA状态。 BUNDLED,NaN或其他。 5.将DA状态分配给“测试”中标记为LSE的新列。
正如我说的那样,代码可以工作,但是需要很长时间(22e6行!实际上是三倍)。