Обновление строки в кадре данных Pandas с использованием loc не работает должным образом - PullRequest
0 голосов
/ 04 сентября 2018

У меня есть датафрейм с именем output -

RAW_ENTITY_NAME   ENTITY_TYPE       ENTITY_NAME        IS_MAIN
01-03-2017        TNRMATDT          01 03 2017         1
04-02-2017        TNRSTRTDT         04 02 2017         1
documents         TNRTYPE           SIGHT              1
documents         TNRDOCSBY         NOT FOUND          1
accept            TNRDTL            accept             1 
23                TNRDAYS           23                 1

print (df.dtypes ())

RAW_ENTITY_NAME               object
ENTITY_TYPE                   object
ENTITY_NAME                   object
IS_MAIN                       object

Примечание - ENTITY_TYPE = TNRTYPE, ENTITY_NAME = SIGHT И IS_MAIN = 1 появятся только один раз в кадре данных.

Я хочу обновить некоторые значения, если ENTITY_TYPE равен TNRTYPE, ENTITY_NAME = SIGHT AND IS_MAIN = 1.

temp = output.loc[(output['IS_MAIN'] == 1) & (output['ENTITY_TYPE'] == 'TNRTYPE'), 'ENTITY_NAME']
temp = temp.reset_index(drop=True)
temp = temp[0]
if (temp == 'SIGHT'):
   output.loc[(output['IS_MAIN'] == '1') & (output['ENTITY_TYPE'] == 'TNRDOCSBY'), 'ENTITY_NAME'] = 'PAYMENT'

   output.loc[(output['IS_MAIN'] == '1') & (output['ENTITY_TYPE'].isin(['TNRDTL'])),
                                   ['ENTITY_NAME', 'RAW_ENTITY_NAME']] = 'NOT APPLICABLE'

   output.loc[(output['IS_MAIN'] == '1') & (output['ENTITY_TYPE'].isin(['TNRDAYS'])),
                                   ['ENTITY_NAME']] = '0'

   output.loc[(output['IS_MAIN'] == '1') & (output['ENTITY_TYPE'].isin(['TNRDAYS'])),
                                   ['RAW_ENTITY_NAME']] = ''

   output.loc[(output['IS_MAIN'] == '1') & (output['ENTITY_TYPE']=='TNRSTRTDT'),
                                   ['ENTITY_NAME', 'RAW_ENTITY_NAME']] = ''

   output.loc[(output['IS_MAIN'] == '1') & (output['ENTITY_TYPE']=='TNRMATDT'),
                                   ['ENTITY_NAME', 'RAW_ENTITY_NAME']] = ''

Окончательный вывод -

RAW_ENTITY_NAME   ENTITY_TYPE       ENTITY_NAME        IS_MAIN
    01-03-2017        TNRMATDT          01 03 2017         1
    04-02-2017        TNRSTRTDT         04 02 2017         1
    documents         TNRTYPE           SIGHT              1
    documents         TNRDOCSBY         PAYMENT            1
    NOT APPLICABLE    TNRDTL            NOT APPLICABLE     1 
                      TNRDAYS           0                  1

Как вы видите, все обновляется, кроме первых двух строк, то есть ENTITY_TYPE = TNRMATDT AND TNRSTRTDAT.

Я хочу знать, почему приведенный ниже код не дает желаемых результатов.

output.loc[(output['IS_MAIN'] == '1') & (output['ENTITY_TYPE']=='TNRSTRTDT'),
                                   ['ENTITY_NAME', 'RAW_ENTITY_NAME']] = ''

output.loc[(output['IS_MAIN'] == '1') & (output['ENTITY_TYPE']=='TNRMATDT'),
                                       ['ENTITY_NAME', 'RAW_ENTITY_NAME']] = ''

Я был бы рад, если бы кто-то мог обнаружить ошибку, которую я совершаю, или рассказать мне какую-нибудь работу.

Большое спасибо.

Ответы [ 2 ]

0 голосов
/ 04 сентября 2018

У меня была такая же проблема. все, что вам нужно сделать, это сделать столбец IS_MAIN числовым

df['IS_MAIN'] = df['IS_MAIN'].astype(int)

Это должно заставить его работать.

0 голосов
/ 04 сентября 2018

Для меня ваше решение работает хорошо, я стараюсь переписать его для лучшего чтения и не повторять те же условия:

temp = output.loc[(output['IS_MAIN'] == '1') & 
                  (output['ENTITY_TYPE'] == 'TNRTYPE'), 'ENTITY_NAME']

#if values in IS_MAIN are integers
#temp = output.loc[(output['IS_MAIN'] == 1) & 
#                  (output['ENTITY_TYPE'] == 'TNRTYPE'), 'ENTITY_NAME']

if (temp.iat[0] == 'SIGHT'):
#more general working if not match condition
#if (next(iter(temp), 'not match') == 'SIGHT'):

    m1 = output['IS_MAIN'] == '1'
    #if values in IS_MAIN are integers
    #m1 = output['IS_MAIN'] == 1
    m2 = output['ENTITY_TYPE'] == 'TNRDOCSBY'
    m3 = output['ENTITY_TYPE'] == 'TNRDTL'
    m4 = output['ENTITY_TYPE'] == 'TNRDAYS'
    m5 = output['ENTITY_TYPE'].isin(['TNRMATDT','TNRSTRTDT'])

    output.loc[m1 & m2, 'ENTITY_NAME'] = 'PAYMENT'

    output.loc[m1 & m3, ['ENTITY_NAME', 'RAW_ENTITY_NAME']] = 'NOT APPLICABLE'

    output.loc[m1 & m4, ['ENTITY_NAME']] = '0'
    output.loc[m1 & m4, ['RAW_ENTITY_NAME']] = ''

    output.loc[m1 & m5, ['ENTITY_NAME', 'RAW_ENTITY_NAME']] = ''

print (output)
  RAW_ENTITY_NAME ENTITY_TYPE     ENTITY_NAME IS_MAIN
0                    TNRMATDT                       1
1                   TNRSTRTDT                       1
2       documents     TNRTYPE           SIGHT       1
3       documents   TNRDOCSBY         PAYMENT       1
4  NOT APPLICABLE      TNRDTL  NOT APPLICABLE       1
5                     TNRDAYS               0       1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...