Перетащите первый экземпляр значения из одного кадра данных в другой - PullRequest
0 голосов
/ 13 октября 2018

Название не великое, поэтому я постараюсь описать, что я ищу.Если вы хотите сначала увидеть какой-то код, это работает, но занимает слишком много времени (моя 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 строк! И действительно, три раза).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...