我有50个DataFrame,它是制表符分隔的,有两列。我需要为这些文件添加列名。
以下是文件的示例,
==> PE07_ID.count <==
ENSG00000000003 0
ENSG00000000005 0
ENSG00000000419 586
ENSG00000000457 97
==> PE07_REL.count <==
ENSG00000000003 2
ENSG00000000005 0
ENSG00000000419 954
==> PE08_ID.count <==
ENSG00000000003 0
ENSG00000000005 0
ENSG00000000419 317
我需要的是为每一个添加列名,我的意思是第一列可以命名为“Gene”,第二列应该以文件名命名
这是我到目前为止所尝试的,
首先我调用了所有文件,
path = '/user/home/files'
files = os.listdir(path)
files_txt = [os.path.join(path,i) for i in files if i.endswith('count')]
## Change it into dataframe
dfs_patty = [pd.DataFrame.from_csv(x, sep='\t') for x in files_txt]
files_txt看起来像这样,对于50个数据帧
['/user/home/AE02_REL.count',
'/user/home/AE04_REL.count',
'/user/home/AE05_ID.count',
'/user/home/AE05_REL.count'....]
在此之后,我尝试为以下
添加两个标题名称或列名称path = '/home/user/dir/'
file_names = []
data_frames = []
for filename in os.listdir(path):
name = os.path.splitext(filename)[0]
file_names.append(name)
df = pd.read_csv(path + filename, header=None,sep='\t')
df.rename(columns={1: name, 0:'Gene'}, inplace=True)
#df.columns = ["Gene",filename]
data_frames.append(df)
combined = pd.concat(data_frames, axis=1)
然后,
combined.head()
Gene AE02_REL Gene AE04_REL Gene AE05_ID Gene AE05_REL Gene AE07_REL ... Gene PL08_REL Gene PL09_ID Gene PL09_REL Gene PL10_ID Gene PL10_REL
0 ENSG00000000003 0 ENSG00000000003 1 ENSG00000000003 2 ENSG00000000003 16 ENSG00000000003 29 ... ENSG00000000003 2 ENSG00000000003 9 ENSG00000000003 1 ENSG00000000003 1 ENSG00000000003 4
5 rows × 100 columns
当我尝试删除重复的列时, 它抛出以下错误,
Columns_dup_droped =combined.drop_duplicates(cols=['Gene'])
pandas/hashtable.pyx in pandas.hashtable.PyObjectHashTable.get_labels (pandas/hashtable.c:13820)()
ValueError: Buffer has the wrong number of dimensions (expected 1, got 2)
最后,我需要每个文件都是这样的,例如,
==> PE07_ID.count <==
ENSG00000000003 0
ENSG00000000005 0
ENSG00000000419 586
ENSG00000000457 97
ENSG00000000460 44
ENSG00000001167 978
应该是,
Gene PE07_ID.count
ENSG00000000003 0
ENSG00000000005 0
ENSG00000000419 586
ENSG00000000457 97
ENSG00000001167 978
此外,Dataframe的尾部有以“__”开头的行,我需要删除最后五行,
我尝试了以下内容,
combined.irow(slice(-5, None))
但它只是给了他们最后一行..我需要从整个dataFrame中删除它们
所有50个DataFrames都是如此..
非常感谢任何帮助。
答案 0 :(得分:1)
如评论中所述,您需要引用完整路径名称。
如果您将路径更改为:
path = '/user/home/files/'
你的循环:
for filename in os.listdir(path):
name = os.path.splitext(filename)[0]
file_names.append(name)
df = pd.read_csv(path + filename, header=None)
df.columns = ["Gene",filename]
data_frames.append(df)
如果读入Dataframe的数据有两列,它应该可以工作。
答案 1 :(得分:0)
所以稍微改变一下,我就能得到我需要的东西, 我发布了帮助我的内容。
path = '/home/user/dir/out/'
file_names = []
data_frames = []
for filename in os.listdir(path):
name = os.path.splitext(filename)[0]
file_names.append(name)
df = pd.read_csv(path + filename, header=None, sep='\t')
df = df.rename(columns={1: name, 0:'Gene'}).set_index('Gene')
data_frames.append(df)
combined = pd.concat(data_frames, axis=1)
因此,当您将索引设置为“Gene”时,您可以看到,同一列不再重复