Как оценить фрейм данных, содержащий выражения мощности в python - PullRequest
0 голосов
/ 22 февраля 2019

Ниже приведен код,

Я пытался использовать df.eval (), но вывод был неожиданным, как показано ниже, пожалуйста, помогите!

import pandas as pd
data = [1,2,2^0,2^6,5]
df = pd.DataFrame(data)
print(df.eval(data))

Вывод: [1 22 4 5] Ожидаемый результат: [1 2 1 64 5]

РЕДАКТИРОВАТЬ:

Предлагаемое решение отлично работает для файла CSV, но не удается, когда файл Excel анализируется.Ниже приведен код:

arrowToPower = lambda x : eval(x.replace('^', '**'))
df = pd.read_excel('test.xlsx', decimal=',', 
converters={'C2': arrowToPower})



output: [['geeky' '2^10']
 ['abs' 2]
 ['sdf' '2^2']]

1 Ответ

0 голосов
/ 22 февраля 2019

В Python , оператор power записывается как ** (не ^).

^ равно XOR operator.

Так что, вероятно, вам следует заменить ^ на **.

Редактировать после вашего комментария

Я полагаю, что вы хотите, чтобы исходные числа читались как "истинные "числа (целые или с плавающей точкой), а не в их текстовом представлении.

Из вашего вопроса я также знаю, что вы хотите изменить, например, 2^0 на промежуточное значение 2**0 и сохранить его также какчисло (в данном случае 1).

Мне не удалось подготовить исходный файл .xlsx (несмотря на мои усилия, мой Юпитер продолжал жаловаться, что это не в кодировке UTF-8 ), поэтому я подготовил пример с чтением из файла .csv .

Итак, давайте начнем с исходного файла .csv :

C1;C2;C3;C4;C5;C6;C7;C8
geeky;0;1,9921875;0;2^0;0;T_U8;0
xyz;0;3,2044218;1;3^4;3;T_X2;4

Первое, на что нужно обратить внимание, это то, что разделитель полей - ; (не запятая).Это необходимо, поскольку числа с плавающей запятой между целой и дробной частью имеют запятую (вместо точки).

C5 столбец содержит 2^0 и 3^4, которые должны быть преобразованы в промежуточную формуиз 2**0 и 3**4 и, наконец, в 1 и 81.

Для выполнения вышеуказанного преобразования я написал функцию:

arrowToPower = lambda x : eval(x.replace('^', '**'))

Затем чтение DataFrame можетбудет выполняться следующим образом:

df = pd.read_csv('Input.csv', sep=';', decimal=',', converters={'C5': arrowToPower})

Обратите внимание на следующие моменты:

  • Input.csv - имя входного файла.
  • sep=';' указываетРазделитель столбцов.
  • decimal=',' указывает, что разделяет целую и дробную части.
  • converters={'C5': arrowToPower} назначает функцию преобразования для столбца C5.

Когда вынапечатайте df, результат будет:

      C1  C2        C3  C4  C5  C6    C7  C8
0  geeky   0  1.992188   0   1   0  T_U8   0
1    xyz   0  3.204422   1  81   3  T_X2   4

Чтобы прочитать из файла Excel , вы должны изменить read_csv на read_excel, изменить имя файла и удалить sep параметр.

Если у вас есть больше столбцов с ^ вместо **, присвойте преобразователю также значениеэти столбцы.

Редактирование, касающееся чтения файла Excel

Наконец мне удалось написать такой файл Excel, который может быть прочитан read_excel.

enter image description here

Затем я выполнил:

df2 = pd.read_excel('Input.xlsx', converters={'C5': arrowToPower})

и получил правильный результат.

Значения, прочитанные в столбец C5, были 1 и 81, так что arrowToPower конвертер определенно был вызван.

Обратите внимание, что первая строка файла Excel содержит имена столбцов, а следующие строки - фактические данные.В случае файлов Excel запятая как разделитель между десятичной и дробной частями - это только проблема представления, а под капотом read_excel читает внутреннее содержимое.Вот почему параметр десятичный здесь не нужен.

Так что я все еще думаю, что ваш входной (Excel) файл в некотором отношении «неправильный», возможно, он не содержит имен столбцов вПервый ряд.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...