Pandas преобразует целые числа в действительные числа при чтении из Excel

Недавно я начал изучать Python для анализа данных Excel. У меня есть файл excel с двумя рабочими листами, каждый с одной матрицей (с m = 1000 строк и n = 999 столбцов). Элементы обеих матриц связаны друг с другом: одна из матриц касается значений смещения, а другая матрица касается значения силы, соответствующие каждому перемещению. Перемещения и соответствующие силы получены из m = 1000 численных симуляций и n = 999 приращений. Можно ли идентифицировать значения силы, которые соответствуют только значениям смещения, которые являются целыми числами? Или, как вариант, заменить все десятичные числа из матрицы перемещений на 0? Я попытался прочитать файл excel в кадре данных Pandas, однако все значения из матрицы смещений кажутся представленными как действительные числа (например, числа 1, 2, 3 и т. д. из excel представлены с плавающей запятой как 1., 2. , 3. в питоне). Спасибо за внимание.


person Pedro Prates    schedule 26.09.2020    source источник
comment
Отвечает ли это на ваш вопрос? Изменить тип столбца со строкового на плавающий в пандах   -  person Nicolò Gasparini    schedule 27.09.2020


Ответы (1)


Давайте сделаем пример в меньшем масштабе (3 * 3).

Я подготовил файл Excel с 2 листами и прочитал их:

displ = pd.read_excel('Input_2.xlsx', 'Displ')
forces = pd.read_excel('Input_2.xlsx', 'Forces')

Оба кадра данных содержат:

displ                      forces
     C1    C2    C3              C1     C2     C3
0  10.0  12.1  11.3        0  120.1  130.2  140.3
1  12.5  13.0  13.5        1  150.4  160.5  170.6
2  12.6  13.6  13.8        2  180.7  190.8  200.9

Чтобы идентифицировать элементы displ, содержащие целые числа (на самом деле, все еще числа с плавающей запятой, но с дробными частями == 0.0), вы можете запустить:

displ.mod(1.0) == 0.0

и вы получите:

      C1     C2     C3
0   True  False  False
1  False   True  False
2  False  False  False

И чтобы получить соответствующие значения force и NaN для других значений, вы можете запустить:

forces.where(displ.mod(1.0) == 0.0)

получающий:

      C1     C2  C3
0  120.1    NaN NaN
1    NaN  160.5 NaN
2    NaN    NaN NaN

Другой вариант — получить список индексов в displ, где соответствующий элемент имеет нулевую дробную часть. На самом деле это функция Numpy, поэтому она работает с базовым массивом Numpy и возвращает целочисленные (отсчитываемые от нуля) индексы:

ind = np.nonzero((displ.mod(1.0) == 0.0).values)

Результат:

(array([0, 1], dtype=int64), array([0, 1], dtype=int64))

так что это два кортежа индексов:

  • индексы строк,
  • индексы столбцов.

Вы также можете получить список указанных элементов из forces, на самом деле также из базового массива Numpy, выполнив:

forces.values[ind]

Результат:

array([120.1, 160.5])

Чтобы заменить целые элементы displ нулями, вы можете запустить:

displ.mask(displ.mod(1.0) == 0.0, 0, inplace=True)

Теперь displ содержит:

     C1    C2    C3
0   0.0  12.1  11.3
1  12.5   0.0  13.5
2  12.6  13.6  13.8

Обратите внимание, что нужные элементы по-прежнему представляют собой плавающие нули, но особенностью Pandas является то, что каждый столбец имеет один тип, соответствующий всем элементам в этом столбец (в данном случае просто float).

person Valdi_Bo    schedule 27.09.2020