在文件循环中连接 pandas 数据帧
concatenate pandas dataframe in a loop of files
我正在尝试编写一个脚本,通过某个 pattern/variable 遍历文件,然后它连接文件的第 8 列,同时保留所有文件共有的前 4 列。如果我使用以下命令,该脚本将起作用:
reader = csv.reader(open("1isoforms.fpkm_tracking.txt", 'rU'), delimiter='\t') #to read the header names so i can use them as index. all headers for the three files are the same
header_row = reader.next() # Gets the header
df1 = pd.read_csv("1isoforms.fpkm_tracking.txt", index_col=header_row[0:4], sep="\t") #file #1 with index as first 5 columns
df2 = pd.read_csv("2isoforms.fpkm_tracking.txt", index_col=header_row[0:4], sep="\t") #file #2 with index as first 5 columns
df3 = pd.read_csv("3isoforms.fpkm_tracking.txt", index_col=header_row[0:4], sep="\t") #file #3 with index as first 5 columns
result = pd.concat([df1.ix[:,4], df2.ix[:,4]], keys=["Header1", "Header2", "Header3"], axis=1) #concatenates the 8th column of the files and changes the header
result.to_csv("OutputTest.xls", sep="\t")
虽然这可行,但对我来说一个一个输入文件名是不切实际的,因为我有时有 100 个文件,所以不能为每个文件输入一个 df... 函数。相反,我试图使用 for 循环来执行此操作,但我无法弄清楚。这是我目前所拥有的:
k=0
for geneFile in glob.glob("*_tracking*"):
while k < 3:
reader = csv.reader(open(geneFile, 'rU'), delimiter='\t')
header_row = reader.next()
key = str(k)
key = pd.read_csv(geneFile, index_col=header_row[0:1], sep="\t")
result = pd.concat([key[:,5]], axis=1)
result.to_csv("test2.xls", sep="\t")
但是,这不起作用。
我遇到的问题如下:
如何遍历输入文件并生成不同的文件
每个变量的名称,然后我可以在
pd.concat函数一个接一个?
如何使用for循环生成字符串文件名
df
和整数
的组合
如何修复上述脚本以获得我想要的项目。
一个小问题是关于我使用 col_index 函数的方式:有没有办法使用列 # 而不是列名?我知道它适用于 index_col=0
或任何单个 #
。但我不能将整数用于 > 1 列的索引。
请注意,所有文件都具有完全相同的结构,索引列也相同。
非常感谢您的反馈。
考虑将 merge 与 right_index
和 left_index
参数一起使用:
import pandas as pd
numberoffiles = 100
# FIRST IMPORT (CREATE RESULT DATA FRAME)
result = pd.read_csv("1isoforms.fpkm_tracking.txt", sep="\t",
index_col=[0,1,2,3], usecols=[0,1,2,3,7])
# ALL OTHER IMPORTS (MERGE TO RESULT DATA FRAME, 8TH COLUMN SUFFIXED ITERATIVELY)
for i in range(2,numberoffiles+1):
df = pd.read_csv("{}isoforms.fpkm_tracking.txt".format(i), sep="\t",
index_col=[0,1,2,3], usecols=[0,1,2,3,7])
result = pd.merge(result, df, right_index=True, left_index=True, suffixes=[i-1, i])
result.to_excel("Output.xlsx")
result.to_csv("Output.csv")
我正在尝试编写一个脚本,通过某个 pattern/variable 遍历文件,然后它连接文件的第 8 列,同时保留所有文件共有的前 4 列。如果我使用以下命令,该脚本将起作用:
reader = csv.reader(open("1isoforms.fpkm_tracking.txt", 'rU'), delimiter='\t') #to read the header names so i can use them as index. all headers for the three files are the same
header_row = reader.next() # Gets the header
df1 = pd.read_csv("1isoforms.fpkm_tracking.txt", index_col=header_row[0:4], sep="\t") #file #1 with index as first 5 columns
df2 = pd.read_csv("2isoforms.fpkm_tracking.txt", index_col=header_row[0:4], sep="\t") #file #2 with index as first 5 columns
df3 = pd.read_csv("3isoforms.fpkm_tracking.txt", index_col=header_row[0:4], sep="\t") #file #3 with index as first 5 columns
result = pd.concat([df1.ix[:,4], df2.ix[:,4]], keys=["Header1", "Header2", "Header3"], axis=1) #concatenates the 8th column of the files and changes the header
result.to_csv("OutputTest.xls", sep="\t")
虽然这可行,但对我来说一个一个输入文件名是不切实际的,因为我有时有 100 个文件,所以不能为每个文件输入一个 df... 函数。相反,我试图使用 for 循环来执行此操作,但我无法弄清楚。这是我目前所拥有的:
k=0
for geneFile in glob.glob("*_tracking*"):
while k < 3:
reader = csv.reader(open(geneFile, 'rU'), delimiter='\t')
header_row = reader.next()
key = str(k)
key = pd.read_csv(geneFile, index_col=header_row[0:1], sep="\t")
result = pd.concat([key[:,5]], axis=1)
result.to_csv("test2.xls", sep="\t")
但是,这不起作用。
我遇到的问题如下:
如何遍历输入文件并生成不同的文件 每个变量的名称,然后我可以在 pd.concat函数一个接一个?
如何使用for循环生成字符串文件名
df
和整数 的组合
如何修复上述脚本以获得我想要的项目。
一个小问题是关于我使用 col_index 函数的方式:有没有办法使用列 # 而不是列名?我知道它适用于
index_col=0
或任何单个#
。但我不能将整数用于 > 1 列的索引。
请注意,所有文件都具有完全相同的结构,索引列也相同。
非常感谢您的反馈。
考虑将 merge 与 right_index
和 left_index
参数一起使用:
import pandas as pd
numberoffiles = 100
# FIRST IMPORT (CREATE RESULT DATA FRAME)
result = pd.read_csv("1isoforms.fpkm_tracking.txt", sep="\t",
index_col=[0,1,2,3], usecols=[0,1,2,3,7])
# ALL OTHER IMPORTS (MERGE TO RESULT DATA FRAME, 8TH COLUMN SUFFIXED ITERATIVELY)
for i in range(2,numberoffiles+1):
df = pd.read_csv("{}isoforms.fpkm_tracking.txt".format(i), sep="\t",
index_col=[0,1,2,3], usecols=[0,1,2,3,7])
result = pd.merge(result, df, right_index=True, left_index=True, suffixes=[i-1, i])
result.to_excel("Output.xlsx")
result.to_csv("Output.csv")