下面是代码,
我尝试使用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']]
答案 0 :(得分:0)
在 Python 中, power 运算符被写为**
(而不是^
)。
^
是 XOR 运算符。
因此,您可能应该将^
替换为**
。
我想您希望源编号读为“ true” 数字(整数或浮点数),而不是其文本表示形式。
从您的问题中我也知道您想更改例如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文件
由read_excel
。
然后我执行了:
df2 = pd.read_excel('Input.xlsx', converters={'C5': arrowToPower})
并获得了正确的结果。
读入C5
列的值为1
和81
,因此arrowToPower
转换器
肯定被称为。
请注意,Excel文件的第一行包含列名
及以下各行-实际数据。
如果是Excel文件,则逗号作为小数点和小数点之间的分隔符
零件只是一个介绍性问题,read_excel
的内容是
内部内容。这就是为什么在这里不需要 decimal 参数的原因。
所以我仍然认为您的输入(Excel)文件在某些方面“错误”, 也许它在第一行中不包含列名。