如何从Dataframe中删除重复的列和最后5行

时间:2016-04-04 13:42:08

标签: python numpy pandas dataframe

我有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都是如此..

非常感谢任何帮助。

2 个答案:

答案 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”时,您可以看到,同一列不再重复