Замените пропущенные значения, используя непустые значения, используя идентификатор в panel data Python

#python #dataframe

#python #dataframe

Вопрос:

У меня есть эта таблица:

     Index     RUC       CIIU     Ejercicio
    1330    20100003512         2000
    1185    20100003512         2001
    2208    20100003512         2002
    3226    20100003512         2003
    4233    20100003512         2004
    5240    20100003512         2005
    6271    20100003512         2006
    7311    20100003512         2007
    8386    20100003512         2008
    9505    20100003512         2009
    10637   20100003512 2732.0  2010
    11799   20100003512 2732.0  2011
    12984   20100003512 2732.0  2012
    14160   20100003512 2732.0  2013
    15342   20100003512 2732.0  2014
    16543   20100003512 2732.0  2015
    17767   20100003512 2432.0  2016
    18990   20100003512 2432.0  2017
    20213   20100003512 2432.0  2018
    21424   20100003512 2432.0  2019
    13200   20100004322         2000
    1184    20100004322         2001
    2207    20100004322         2002
    3225    20100004322         2003
    4232    20100004322         2004
    5239    20100004322         2005
    6270    20100004322         2006
    7310    20100004322         2007
    8385    20100004322         2008
    9504    20100004322         2009
    10636   20100004322 2221.0  2010
    11798   20100004322 2221.0  2011
    12983   20100004322 2221.0  2012
    14159   20100004322 2221.0  2013
    15341   20100004322 2221.0  2014
    16542   20100004322 2221.0  2015
    17766   20100004322 2221.0  2016
    18989   20100004322 2220.0  2017
    20212   20100004322 2220.0  2018
    21423   20100004322 2220.0  2019
 

Как вы видите, у меня есть три переменные: RUC, CIIU и Ejercicio. RUC — это мой идентификатор, а Ejercicio — моя временная переменная. Я хотел бы заменить пустые значения в столбце CIIU, используя доступные значения, например, в этом случае должно быть:

    Index     RUC             CIIU    Ejercicio
    1330    20100003512 2432.0  2000
    1185    20100003512 2432.0  2001
    2208    20100003512 2432.0  2002
    3226    20100003512 2432.0  2003
    4233    20100003512 2432.0  2004
    5240    20100003512 2432.0  2005
    6271    20100003512 2432.0  2006
    7311    20100003512 2432.0  2007
    8386    20100003512 2432.0  2008
    9505    20100003512 2432.0  2009
    10637   20100003512 2732.0  2010
    11799   20100003512 2732.0  2011
    12984   20100003512 2732.0  2012
    14160   20100003512 2732.0  2013
    15342   20100003512 2732.0  2014
    16543   20100003512 2732.0  2015
    17767   20100003512 2432.0  2016
    18990   20100003512 2432.0  2017
    20213   20100003512 2432.0  2018
    21424   20100003512 2432.0  2019
    13200   20100004322 2221.0  2000
    1184    20100004322 2221.0  2001
    2207    20100004322 2221.0  2002
    3225    20100004322 2221.0  2003
    4232    20100004322 2221.0  2004
    5239    20100004322 2221.0  2005
    6270    20100004322 2221.0  2006
    7310    20100004322 2221.0  2007
    8385    20100004322 2221.0  2008
    9504    20100004322 2221.0  2009
    10636   20100004322 2221.0  2010
    11798   20100004322 2221.0  2011
    12983   20100004322 2221.0  2012
    14159   20100004322 2221.0  2013
    15341   20100004322 2221.0  2014
    16542   20100004322 2221.0  2015
    17766   20100004322 2221.0  2016
    18989   20100004322 2220.0  2017
    20212   20100004322 2220.0  2018
    21423   20100004322 2220.0  2019
 

Мой текущий код:

 for i in range(len(data_trimestral)):
    data_trimestral['Ejercicio'][i] == int(data_trimestral['Ejercicio'][i])
lista_rucs = data_trimestral['RUC'][data_trimestral['Ejercicio'] > 2009].tolist()
lista_ciiu = data_trimestral['CIIU'][data_trimestral['Ejercicio'] > 2009].tolist()
tuple_data = tuple(zip(lista_rucs, lista_ciiu))
for i in range(len(data_trimestral)):
    for a,b in tuple_data:
        if data_trimestral['Ejercicio'][i] < 2010:
            data_trimestral['CIIU'][data_trimestral['RUC'][i] == a] = b
 

Но, похоже, это не работает, потому что на это уходит много времени. Любая помощь будет действительно оценена.

Комментарии:

1. Можете ли вы уточнить, что вы имеете в виду, когда говорите: » Я хотел бы заменить пустые значения в столбце CIIU, используя доступные значения»? Почему вы заполнили все пустые значения 2432?

2. Поскольку CIIU является международным классификатором предприятий, но я очистил данные, потому что до 2010 года была версия CIIU 3.0, а после 2010 года используется версия CIIU 4.0, и между ними есть небольшие различия. Я хотел бы заменить наиболее близкое значение на 2020 (в данном случае 2019)

3. Я все еще в значительной степени не понял, откуда вы хотите получить эти конкретные данные, но решение вашей текущей проблемы, о которой вы говорите, заключается в том, что ее выполнение занимает слишком много времени, вы можете использовать здесь многопроцессорный цикл. Вы можете использовать multiprocessing.pool. Пул для этого. Пул имеет функцию map, которая позволяет выполнять несколько итераций параллельно. Если вы можете поделиться всем вводом, я могу попытаться найти лучшее решение, если это возможно

4. Да, я имею в виду, это может немного запутать, чтобы объяснить. Я просто хочу заменить пустое значение из столбца ‘CIIU’ значениями за 2019 год (учитывая столбец ‘Ejercicio’ как годы). Например, в таблице у меня есть два идентификатора: 20100004322 и 20100003512, поэтому я хотел бы взять значение ‘CIIU’ за 2019 год, сначала для 20100004322 2432.0 и поместить его в пустые значения из столбца CIIU (с 2000 по 2009 год).

5. Для этого вы можете просто извлечь последнее значение из фрейма данных, используя: `newdf = df [(df [‘RUC’] == 20100004322) amp; (df [‘Ejercicio’] == 2019)]’ После этого просто используйте iloc и извлеките значение CIIU из newdf изамените его значениями nan. если вы хотите дальнейшей настройки, вы можете использовать цикл for для перебора каждой строки df и проверки, совпадает ли год с 2000 по 2009 год, и если это так, просто примените значение из iloc к пустой ячейке