#python #pandas #dataframe
#python #pandas #фрейм данных
Вопрос:
У меня есть файл Excel с указанным ниже форматом данных для импорта в фрейм данных.
Мой текущий код позволяет мне извлекать точные строки, как показано на рисунке, в фрейм данных.
df_gdp = pd.read_excel (open(gdp_path,'rb'), sheet_name='T2', skiprows= 5, skipfooter= 29)
Ниже приведены данные в Excel:
Ниже приведен мой вывод фрейма данных:
Проблема: значения, показанные выше, импортируются как строка с апострофом в начале и конце, которые не отображаются.
Когда я попытался преобразовать значения в int, используя приведенные ниже методы, это не сработало.
df_gdp.iloc[1:, 1] = df_gdp.iloc[1:, 0].str.replace("'", "").astype(float)
or
b1 = df_gdp.iloc[:, 54:61].values.astype(float)
Ошибка значения: не удалось преобразовать строку в float: ‘384,870.3’
Есть кое-что, что я, возможно, пропустил либо в своем коде, я должен был добавить что-то ранее в моем readexcel во время импорта, но я не знаю, как это сделать.
Я просмотрел аргумент dtype для readexcel, но не смог найти пример того, как объявить определенный диапазон столбцов для преобразования в int во время импорта. Пример, который я нашел, похож на приведенный ниже:
pd.read_excel('tmp.xlsx', index_col=0, dtype={'Name': str, 'Value': float})
Мои данные слишком много лет создавались в виде столбцов для объявления по отдельности, есть ли выход?
Мой желаемый вывод массива numpy после преобразования приведен ниже (не [ ‘69124.4’ ….]) :
[ 69124.4 63585.4 51331.7 174596.4 183850.7 -107672.4 49833.8
120578.6 40884.1 106405. 126586.1 94867.2 22184.3 100575.9
110966.1 52548.9 243641.7]
Ответ №1:
Вместо:
df_gdp.iloc[1:, 1] = df_gdp.iloc[1:, 0].str.replace("'", "").astype(float)
Вы должны использовать:
lst = df_gdp.iloc[0,1:].to_list()
lst = [s.replace(',', '') for s in lst]
lst = [float(i) for i in lst]
Теперь lst равен: [69124.4 63585.4 51331.7 174596.4 , ...]
Отлично работает для:
Комментарии:
1. Привет, Мейсам, я пробовал ваш код, но он не работает. файл Excel является in.xlsx и эта часть при замене («,», «»») заменяет запятую-разделитель пробелом, верно? Значение в фрейме данных по-прежнему отображается как строка ‘384,870.3’
2. Нет, программа возвращает ошибку ValueError: не удалось преобразовать строку в float: ‘Series([])’