如何在python中评估包含幂表达式的数据框

时间:2019-02-22 11:37:45

标签: python pandas dataframe

下面是代码,

我尝试使用df.eval(),但输出意外,如下所示, 请帮忙!

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

输出:[1 2 2 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 :(得分:0)

Python 中, power 运算符被写为**(而不是^)。

^ XOR 运算符。

因此,您可能应该将^替换为**

根据您的评论进行编辑

我想您希望源编号读为“ true” 数字(整数或浮点数),而不是其文本表示形式。

从您的问题中我也知道您想更改例如2^02**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^03^4,它们将被转换 到2**03**4的中间形状,最后到 181

要进行上述转换,我编写了一个函数:

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列的值为181,因此arrowToPower转换器 肯定被称为。

请注意,Excel文件的第一行包含列名 及以下各行-实际数据。 如果是Excel文件,则逗号作为小数点和小数点之间的分隔符 零件只是一个介绍性问题,read_excel的内容是 内部内容。这就是为什么在这里不需要 decimal 参数的原因。

所以我仍然认为您的输入(Excel)文件在某些​​方面“错误”, 也许它在第一行中不包含列名。