pandas, dataframe获取最后一行的三种方法
这次为了做NLP的第一个作业:隐马尔科夫模型的词性判断,开始接触pandas,numpy和pandas我真的很不熟,导致了作业晚交,理解了原理但代码写得很痛苦。
用测试集计算了词性之间的转移概率,转换成矩阵;以及词性到单词的发射概率,转换成矩阵,记得import numpy as np。
veterbi 算法获取预测的词性结果,因为我传进去的观察序列,也就是测试句转换成的单词表,是训练集的每个句子的单词在测试集的单词列表中的对应的索引,所以生成的词性列表就要和传进去的观察序列重新匹配上,才能判断到底预测得对不对。
可把我给难到了,我返回的预测结果是一个矩阵,行的索引是全部训练集里的全部词性,列的索引是每个单词。本来就也不知道怎么做,用了numpy的求每列的最大值的行索引和列索引的方法来返回了一个row, col,其中axis=0是每行,axis=1是每列。row是每列最大值对应的行号组成的列表,col是每列最大值的列号。然后在test_output里新增(单词,词性),有多少个单词新增多少个这样的元组。但是这样的代码可读性太差了,我估计自己第二天来看就看不懂这些col[i]是些什么。
row, col = np.where(np.max(F, axis=0)) # get the max pos for each word
for i in range(len(obs_seq)):test_output.append((obs_seq[col[i]], pi[row[i]])) # tag index in emission array
然后我又用了第二种办法,把输出矩阵F转换成pandas的dataframe,这个dataframe的行索引还是定义为训练集的全部词性,列索引还是每个单词,但是这样行列就不是123...这种可读性极差的东西了,可以很直观地看出每个单词的词性预测结果里,哪个词性的概率最大。那么我只需要新增一行,表示最大概率的那个数字就可以了。当然要先import pandas哈。其中F是预测结果的矩阵,transitions_probability是转移概率矩阵,emissions_probability是发射概率矩阵,obs_seq是观察序列。F_df是F转换成dataframe。
for sent in test_sents:# get the number of total test sentencestotal_count += 1# get expected output of a specific sentence in test setexpected_output = []words_list = []for token in sent:expected_output.append( (token.get('form'), token.get('upos')) )for i in range(len(sorted_words_set)): # get token's index in sorted train_sents words listif sorted_words_set[i] == token.get('form'):obs_seq.append[i]words_list.append(token.get('form'))F = viterbi(transitions_probability, emissions_probability, pi, obs_seq)F_df = pd.DataFrame(F, index=sorted_tags_set, columns=words_list , )
F_df.loc['max_idx'] = emission_df.idxmax(axis=0) #求每一列的最大值对应的行索引
然后我要把F_df的列索引,也就是单词列表,和max_idx这一行,也就是每个单词的预测词性这一行一一匹配上。对于怎么取出这一行,我其实试了很多方法,但是都不对,反正是并不困难的事吧,后来直接用最简单的
F_df.values[-1] 取出来了,不需要tolist(),也不要需要astype(str)。之前我查的是,dataframe里字符串是object,但是我需要转成python里的str才能进行迭代(我的代码需要),哎呀然后发现直接用下标访问就可以了,
F_df.values[-1][i]这样就可以。
然后,再记录下另外两种取出最后一行的方法哈:
F_df.tail(1).values.tolist() 这个很简单,但是数据形式是dataframe的,不是我需要的,这里没有用。
F_df.iloc[-1].tolist()
这个其实也可以,通过下标去取的。
pandas, dataframe获取最后一行的三种方法相关推荐
- java 获取键盘点击_Java中获取键盘输入值的三种方法介绍
程序开发过程中,需要从键盘获取输入值是常有的事,但Java它偏偏就没有像c语言给我们提供的scanf(),C++给我们提供的cin()获取键盘输入值的现成函数!Java没有提供这样的函数也不代表遇到这 ...
- 反射:获取Class类的三种方法
反射:获取Class类的三种方法 // 1.Class类中的一个静态方法:forName(全限名:包名 + 类名) Class c = Class.forName(路径); System.out.pr ...
- java 获取当前时间的三种方法是什么
本文主要介绍java获取当前时间的三种方法.这篇文章很详细,有一定的参考价值.有需要的朋友可以参考一下. 总结一些java中获取当前时间的方法. System.currentTimeMillis() ...
- java当前时间_java 获取当前时间的三种方法
总结java里面关于获取当前时间的一些方法 System.currentTimeMillis() 获取标准时间可以通过System.currentTimeMillis()方法获取,此方法不受时区影响, ...
- php中获取对象的属性值,PHP获取对象属性的三种方法
今天查看yii源码,发现yii\base\Model中的attribute()方法是通过反射获取对象的public non-static属性.记得以前看到的代码都是用get_object_vars() ...
- JAVA获取当前时间的三种方法
1.java.util.Date day=new Date(); SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd HH:mm:s ...
- java 获取随机数字的三种方法
1 //方法1 (数据类型) 2 //(最小值+Math.random()*(最大值-最小值+1)) 3 // 例: 4 (int)(1+Math.random()*(10-1+1)) //从1到10 ...
- php post如何获取数据,php获取POST数据的三种方法
方法一,$_POST $_POST或$_REQUEST存放的是PHP以key=>value的形式格式化以后的数据. $_POST方式是通过 HTTP POST 方法传递的变量组成的数组,是自动全 ...
- 获取表单对象,得三种方法getElementById(), getElementsByName(), and getElementsByTagName() 和用法...
今天碰到了翻页不好用的问题,检查一下发现没有表单,加上去就好了,发现获取某个对象值的方法有很多,但是使用哪一个才是正规的途径那,问了同事,得出结论如下: document.表单名称.对象名称.属性 ...
最新文章
- XCode4 实践HelloWorld
- 【Android】Uri、UriMatcher、ContentUris详解
- 强势崛起的Python会在十年内取代Java吗?
- AVIO内存输入模式
- 服务器突然关机的操作系统日志,一台R410 服务器不定时宕机,系统日志只有“上一次系统是意外关闭”...
- o_rdonly_O_RDWR, O_CREAT等open函数标志位在哪里定义? | 学步园
- python中模块和包是什么_Python中模块和包的概念
- hiho1482出勤记录II(string类字符串中查找字符串,库函数的应用)
- PostgreSQL的几种分布式架构对比
- mongodb 连接失败
- python实战项目(Django技术点)
- 中职学生计算机学情分析报告,中职学校学生学情分析及对策
- ABAQUS2017帮助文档查看_51CAE_新浪博客
- FEMA和地×××府运用GIS对抗灾害
- 计算机如何隐藏任务栏的程序,Win7隐藏任务栏
- 南方cass提取坐标生成表格_南方cass方格网角点坐标及高程的识别与导出
- java二重积分_用java实现二重积分的计算
- 前端学习个人心得,总结(个人向)
- 关于Qt高分屏缩放几个知识点
- (挺好)最详细的Yolov3边框预测分析