作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个文本文件(制表符分隔),我需要计算文本文件中每一列的概率和熵。这是我的文本文件的样子:
aaa 0.0520852296 0.1648703511 0.1648703511
bbb 0.1062639955 0.1632039268 0.1632039268
ccc 1.4112745088 4.3654577641 4.3654577641
ddd 0.4992644913 0.1648703511 0.1648703511
eeee 0.169058175 0.1632039268 0.1632039268
因此我可以使用以下代码计算概率:
import pandas as pd
f=open(mydata,'r')
df = pd.DataFrame(pd.read_csv(f, sep='\t', header=None, names=['val1', 'val2', 'val3']))
print(df)
df.loc[:,"val1":"val3"] = df.loc[:,"val1":"val3"].div(df.sum(axis=0), axis=1)
print(df)
哪些输出,
aaa 0.0232736716 0.0328321936 0.0328321936
bbb 0.0474828153 0.0325003428 0.0325003428
ccc 0.6306113983 0.8693349271 0.8693349271
ddd 0.2230904597 0.0328321936 0.0328321936
eeee 0.0755416551 0.0325003428 0.0325003428
在那个输出上我想计算熵并将结果作为输出文件给我,所以我有以下代码
import math
entropy = - sum([ p * math.log(p) / math.log(2.0) for p in df ])
但是我收到以下错误信息:
TypeError: a float is required
非常感谢任何帮助。谢谢大家
最佳答案
你的问题出在这一行
entropy = - sum([ p * math.log(p) / math.log(2.0) for p in df ])
如果您考虑(或打印出)p for p in df
给您的是什么(例如运行 print([p for p in df])
),您可以看到 p
仅包含列的标题。因此,您将文本标签传递给需要 float
的 math
函数。因此错误。
apply
在这里可能很适合你:
import math
def shannon(col):
entropy = - sum([ p * math.log(p) / math.log(2.0) for p in col])
return entropy
sh_df = df.loc[:,'val1':'val3'].apply(shannon,axis=0)
print(sh_df)
正如其他人所指出的,您可能希望通过将第 0 列作为索引来整理您的数据框——这样您就不必使用
df.loc[:,'val1':'val3']
因此您可以使用以下方式导入数据:
df = pd.read_csv(f, sep='\t', header=None, index_col=0, names=['val1', 'val2', 'val3'])
并避免使用繁琐的 loc[:,'val1':'val3']
语法
关于python - 读取文本文件并计算概率和香农熵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31075772/
我是一名优秀的程序员,十分优秀!