编辑:一个更好的循环在底部也。P是我对熊猫的缩写。
我正在尝试引入一些光谱,这些频谱可以作为.csvs (没有标头),合并它们,并删除一些列。这些光谱最初以两列格式提供:
col1 col2 col1-1 col1-2 col2-1 col2-2 ... colm-1 colm-2
X1 Y1 X M spectra to make X1-1 Y1-1 X2-1 Y2-1 ... Xm-1 Ym-1
... ... ...
Xn Yn X1-n Y1-n X2-n Y2-n ... Xm-n Ym-n所有的Col1都是多余的。通过删除所有的Col1或除第一Col1之外的所有,光谱已经准备好在我构建的几个不同的工具中使用。
问题在于我的进气循环:
extension = 'csv'
all_filenames = [i for i in glob.glob('*.{}'.format(extension))]
mergespec=p.DataFrame()
for f in all_filenames:
file = p.read_csv(f, header=None, names=["WVNB", "Int"]),
filemerge = p.merge(file, mergespec, on="WVNB", how='outer')对象'file‘作为元组返回。代码在合并步骤中失败,因为“只能合并序列或DataFrame对象,类'tuple’被传递”,因此被拒绝。
我可以确认“all_filenames”是正确填充的,并且read_csv在这个循环之外工作得很好。事实上,我在另一个笔记本中有一个类似的循环,它连接光谱精细(我在图形生成中使用)。
亲爱的读者,我是非常新的Python和我的代码,如果90%脚本儿童抢劫。请帮助我理解为什么我的p.read_csv返回一个元组,或者我是如何修改这个循环的。谢谢!
编辑: Malwaisen和Vishwas都回答了关于元组一代的问题,这确实有效。它还打开了匹配列名的其他问题。然而,在阅读了Pandas Merging 101之后,我发现了一个更简洁的循环:
filemerge = p.concat([p.read_csv(f, header = None, names=["cm^-1", f]) for f in all_filenames], axis=1)它取代了从mergespec=p.Dataframe()到之前的所有内容。这符合我的目标,用较少的线条。另外,由于f是列名和文件名,所以我使用df.columns.str.rstrip('.0.csv')和lstrip将文件名中的相关示例ID保留为列名。
发布于 2020-01-06 22:02:31
在file=...末尾有一个逗号。Python将其视为一个元组,其中file[0]是您的文件,您可以使用附加逗号的file[1]等等。
只要去掉那个逗号,你就可以走了。或者,如果逗号靠近您的心脏,请在合并语句中使用file[0]。
发布于 2020-01-06 21:49:38
试试这个片段,看看它是否有效。
extension = 'csv'
all_filenames = [i for i in glob.glob('*.{}'.format(extension))]
mergespec=p.DataFrame()
for f in all_filenames:
file = p.read_csv(list (f), header=None, names=["WVNB", "Int"]),
filemerge = p.merge(file, mergespec, on="WVNB", how='outer')https://stackoverflow.com/questions/59619399
复制相似问题