Название не великое, поэтому я постараюсь описать, что я ищу.Если вы хотите сначала увидеть какой-то код, это работает, но занимает слишком много времени (моя df «Test» имеет длину 22e6 строк).
Эта df «Test»:
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-файл "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-файл "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
Я бы хотел, чтобы выходной файл был новым столбцом в "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», который соответствует первомуэкземпляр даты в «Тесте», попадающий между датами (для этого MTRCYCCD) «метра».2. Потяните за название столбца, зачистите KWH_ и замените на DA_.Присвойте это 'col' 3. Найдите строку в Item16, которая соответствует SA_ID с SA в 'Test'.4. Используйте эти строки и столбцы, чтобы получить из «Item16» статус DA для этого конкретного месяца.Либо ЗАБОРНЫЙ, НАН или другой.5. Присвойте статус DA новому столбцу в «Test», помеченному LSE.
Как я уже говорил, код работает, но занимает очень много времени (22e6 строк! И действительно, три раза).