#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 к пустой ячейке