Python Pandas iterrows方法

时间:2015-02-03 22:58:00

标签: python csv pandas

我是“伪”通过读取csv文件创建.bib文件,然后按照structure写下包括换行符在内的所有内容。这是一个繁琐的过程,但它是在python中将csv转换为.bib的原始形式。

我正在使用Pandas来读取csv并逐行写入(因为它有特殊字符我正在使用latin1编码器)但是我遇到了一个很大的问题:它只读取第一行。来自官方documentation我正在逐行阅读他们的方法,这只给我第一行(例子1):

 row = next(df.iterrows())[1] 

但是如果我删除了下一个()和[1],它会让我将每一列的内容集中在一个字段中(例2)。

为什么会这样?为什么在文档中使用该方法并不能很好地遍历所有行?示例1的解决方案如何,但对于所有行?

我的代码:

import csv
import pandas
import bibtexparser
import codecs

colnames = ['AUTORES', 'TITULO', 'OUTROS', 'DATA','NOMEREVISTA','LOCAL','VOL','NUM','PAG','PAG2','ISBN','ISSN','ISSN2','ERC','IF','DOI','CODEN','WOS','SCOPUS','URL','CODIGO BIBLIOGRAFICO','INDEXAÇÕES',
        'EXTRAINFO','TESTE']
data = pandas.read_csv('test1.csv', names=colnames, delimiter =r";", encoding='latin1')#, nrows=1

df = pandas.DataFrame(data=data)

with codecs.open('test1.txt', 'w', encoding='latin1') as fh:
    fh.write('@Book{Arp, ')
    fh.write('\n')

rl = data.iterrows()

for i in rl:
    ix = str(i)
    fh.write('  Title                    = {')
    fh.write(ix)
    fh.write('}')
    fh.write('\n')
PS:我是python和编程的新手,我知道这个代码有缺陷,并不是将csv转换为bib的最有效方法。

1 个答案:

答案 0 :(得分:1)

示例row = next(df.iterrows())[1]故意仅返回第一行。

df.iterrows()会在元组上返回generator来描述这些行。元组的第一个条目包含行索引,第二个条目是一个包含行数据的pandas系列。

因此,next(df.iterrows())返回生成器的下一个条目。如果以前没有调用next,那么这是第一个元组。 因此,next(df.iterrows())[1]将第一行(即第二元组条目)作为熊猫系列返回。

您正在寻找的东西可能是这样的:

for row_index, row in df.iterrows():
   convert_to_bib(row)

其次,您对文件句柄fh的所有写入都必须在块with codecs.open('test1.txt', 'w', encoding='latin1') as fh:内完成 因为在块的末尾,文件句柄将被关闭。

例如:

with codecs.open('test1.txt', 'w', encoding='latin1') as fh:
    # iterate through all rows
    for row_index, row in df.iterrows():
       # iterate through all elements in the row
       for colname in df.columns:
           row_element = row[colname]
           fh.write('%s = {%s},\n' % (colname, str(row_element)))

仍然我不确定列的名称是否与您想到的bibtex字段完全匹配。可能你必须先转换它们。但我希望你能得到迭代背后的原理: - )