Python Pandas iterrows 方法
Python Pandas iterrows method
我 "pseudo" 通过读取 csv 文件创建一个 .bib 文件,然后 structure 写下包括换行符在内的所有内容。这是一个乏味的过程,但它是在 python 中将 csv 转换为 .bib 的原始形式。
我正在使用 Pandas 读取 csv 并逐行写入,(因为它有特殊字符我正在使用 latin1 编码器)但我遇到了一个大问题:它只读取第一排。来自官方 documentation 我正在使用他们的方法逐行阅读,这只给了我第一行(示例 1):
row = next(df.iterrows())[1]
但是如果我删除 next() 和 [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 的最有效方法。
例子row = next(df.iterrows())[1]
故意只returns第一行。
df.iterrows()
returns generator 在 元组 上描述行。元组的第一个条目包含行索引,第二个条目是包含行数据的 pandas 系列。
因此,next(df.iterrows())
returns 生成器的下一个条目。如果之前未调用 next
,则这是第一个 元组 。
因此,next(df.iterrows())[1]
returns 第一行(即第二个元组条目)作为 pandas 系列。
你要找的可能是这样的:
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 字段完全匹配。可能你必须先转换这些。但我希望你能理解迭代背后的原理:-)
我 "pseudo" 通过读取 csv 文件创建一个 .bib 文件,然后 structure 写下包括换行符在内的所有内容。这是一个乏味的过程,但它是在 python 中将 csv 转换为 .bib 的原始形式。
我正在使用 Pandas 读取 csv 并逐行写入,(因为它有特殊字符我正在使用 latin1 编码器)但我遇到了一个大问题:它只读取第一排。来自官方 documentation 我正在使用他们的方法逐行阅读,这只给了我第一行(示例 1):
row = next(df.iterrows())[1]
但是如果我删除 next() 和 [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 的最有效方法。
例子row = next(df.iterrows())[1]
故意只returns第一行。
df.iterrows()
returns generator 在 元组 上描述行。元组的第一个条目包含行索引,第二个条目是包含行数据的 pandas 系列。
因此,next(df.iterrows())
returns 生成器的下一个条目。如果之前未调用 next
,则这是第一个 元组 。
因此,next(df.iterrows())[1]
returns 第一行(即第二个元组条目)作为 pandas 系列。
你要找的可能是这样的:
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 字段完全匹配。可能你必须先转换这些。但我希望你能理解迭代背后的原理:-)