2016-01-13 119 views
1

我试图从40个几乎相似的csv文件与熊猫合并一个数据列。这些文件包含来自Windows'Tasklist'命令生成的csv表单中窗口进程的信息。如何将多个csv文件中的单个数据列合并到Pandas中?

我想要做的是,通过使用PID作为关键将这些文件中的内存信息合并到一个文件中。但是,有些随机出现的不重要的进程偶尔出现,但会导致csv文件之间的不一致。意思是在一些文件中可能有65行,在某些文件中有75行。然而,这些随机过程并不重要,它们的PID改变不应该存在,并且在合并文件时也应该将其丢弃。

这是我第一次尝试这样做:

# CSV files have following columns 
# Image Name, PID, Session Name, Session #, Mem Usage 

file1 = pd.read_csv("tasklist1.txt") 
file1 = file1.drop(file1.columns[[2,3]], axis=1)  

for i in range(2,41): 

    filename = "tasklist" + str(i) + ".txt" 

    filei = pd.read_csv(filename) 
    filei = filei.drop(filei.columns[[0,2,3]], axis=1) 

    file1 = file1.merge(filei, on='PID') 


file1.to_csv("Final.txt", index=False) 

从第一个CSV文件,我刚落会话名称和会话#列,但保持图像的名称,就像标题的每一行。然后,从以下csv文件中,我只保留PID和Mem Usage列,并尝试将之前一直增长的csv文件与即将到来的文件中的数据合并。

这里的问题是,当循环进入第5次迭代时,它不能再合并文件,因为我得到“Reindexing只对有唯一值的索引对象有效”错误。

所以我可以合并第一个循环内的第一个文件与第二到第四。如果我然后创建第二个循环,我将第五个文件合并到第6到第8个文件,然后将这两个合并文件合并到一起,文件1到8中的所有数据将合并得非常好。

任何建议如何执行这种链式合并而不创建x额外的循环?在这一点上,我正在试验40个文件,实际上可以通过强制使用嵌套循环来完成整个过程,但这不是首先合并的有效方式,而且如果我需要缩放以合并甚至更多的文件。

+0

重复列名称将导致此错误,请尝试消除重复的列名称。 – jezrael

+0

谢谢!添加后缀=('_ x'+ str(i),'_y'+ str(i))似乎可以避免重复列名。从来没有想过类似的列名可能会引发这个唯一的id值错误。 – zaplec

+0

我可以根据评论创建答案吗?你接受它吗? – jezrael

回答

1

重复的列名称将导致此错误。

所以,你可以在功能merge添加参数suffixes

后缀:2长度序列(元组,列表,...)

后缀适用于在重叠的列名左侧和右侧,分别为

Overlapping value columns

相关问题