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