繁体   English   中英

如何阅读 pandas 中的第一列和最后一列?

[英]How to read first and last column in pandas?

我正在寻找解决方案,但找不到任何工作。

所以我有一个txt文件。 它看起来像这样:

geneName1, sampleName1, Allel, allel2, 055, 33, tumor
geneName2, sampleName1, Allel, allel2, 321, 1, ntn
geneName3, sampleName1, Allel, allel2, 32, 44, ddd
geneName4, sampleName1, Allel, allel2, 123, 2, aga2
geneName1, sampleName2, Allel, allel2, 01255, 23, tumorD
geneName2, sampleName2, Allel, allel2, 33, 1, ad2
geneName1, sampleName3, Allel, allel2, yyu
geneName2, sampleName3, Allel, allel2, hhf
geneName4, sampleName3, Allel, allel2, vgv
geneName5, sampleName3, Allel, allel2, aga5

而且它没有 header。 但为了清楚:

nameOfGene, sampleNumber, Allel1, Allel2, GS1, GS2, descr

正如你所看到的,有些行没有GS1GS2数据,但都有一个descr 我需要的是[nameOfGene,sampleNumber,Allel1,Allel2,descr]

这就是问题所在。 我尝试了许多来自互联网的解决方案,但无法解决。

我尝试将 pd.read_csv 中的usecols=[]参数修改为pd.read_csv usecols=[0,1,2,3,4,:-1] ,但是 pandas 不理解类似的内容,并且出现了 olny 语法错误。 我尝试读取整个 df 但随后desc被读取为GS1 (如果GS1不在行中)。

我试过concat ,但结果和上面一样,当行没有 GS1 时, desc 被加载为 GS1,cols 旁边是 0 或 NaN。

也许我只是省略了一些东西并存在解决该问题的好方法?

我假设您的文本文件名为myfile.txt

import pandas as pd

my_file = open("myfile.txt")
text = [k.split()[0:4]+[k.split()[-1]] for k in my_file.readlines()]
my_file.close()
df= pd.DataFrame(text)
# next line is optional, just if you want named columns
df.columns = ['nameOfGene','sampleNumber','Allel1','Allel2','descr']
print(df)

   nameOfGene  sampleNumber  Allel1   Allel2   descr
0  geneName1,  sampleName1,  Allel,  allel2,   tumor
1  geneName2,  sampleName1,  Allel,  allel2,     ntn
2  geneName3,  sampleName1,  Allel,  allel2,     ddd
3  geneName4,  sampleName1,  Allel,  allel2,    aga2
4  geneName1,  sampleName2,  Allel,  allel2,  tumorD
5  geneName2,  sampleName2,  Allel,  allel2,     ad2
6  geneName1,  sampleName3,  Allel,  allel2,     yyu
7  geneName2,  sampleName3,  Allel,  allel2,     hhf
8  geneName4,  sampleName3,  Allel,  allel2,     vgv
9  geneName5,  sampleName3,  Allel,  allel2,    aga5

首先将第一行作为数据框读取。 然后,读取具有所需列的两个单独的数据帧,第二个数据帧语法为[-2:-1]以读取最后一列。 然后在索引上将数据框合并在一起:

cols = pd.read_csv(file, nrows=1).columns
df1 = pd.read_csv(file, usecols=cols[0:3])
df2 = pd.read_csv(file, usecols=cols[-2:-1])
df = pd.merge(df1, df2, how='left',left_index=True, right_index=True)
df

您可能必须编辑文件以包含 GS1 和 GS2 中不可用的值。 可以通过在descr之前添加 2 个逗号来工作。 将其作为 pandas 中的 dataframe 导入后,使用代码

new_df = dataframe[['nameOfGene','sampleNumber','Allel1','Allel2','descr']]

这将存储仅包含 nameOfGene、sampleNumber、Allel1、Allel2、descr 列的新 dataframe。 如果您只希望第一列和最后一列排除 sampleNumber、Allel1 和 Allel2。

下面的代码获取您的文本文件并创建一个包含描述信息的新列。 然后,我们从 dataframe 中删除不必要的列,只留下您想要保留的内容。

import pandas as pd

file='*.txt' ##put your file path and filename here
DATA = pd.read_csv(file, sep=" ", header=None)

new_data=[]
#print(DATA)
#print(len(DATA))
for i in range(len(DATA)):
    #print(DATA.loc[i][6])
    if not DATA.isnull().loc[i,6]: 
        new_data.append(DATA.loc[i][6])
    else:
        new_data.append(DATA.loc[i][4])
DATA['NewColumn'] = new_data
DATA=DATA.drop(DATA.columns[[4,5,6]], axis=1)
print(DATA)

有很多方法可以做到这一点。 您可以尝试以下操作,注意读取数据的方式,然后将所有内容放在所需的 Dataframe 中。

columns = ['nameOfGene', 'sampleNumber', 'Allel1', 'Allel2', 'descr']
file = open('test_data.txt', 'r')
lines = file.readlines()

df = pd.DataFrame(columns = columns)
for line in lines:
     split_line = line.split(',')
     if len(split_line) == 7:
           row_data = split_line[0:4] + [split_line[6]]
     elif len(split_line) == 5:
           row_data = split_line

     row = pd.Series(row_data, index=columns)
     df = df.append(row, ignore_index=True)

结果:

   nameOfGene  sampleNumber  Allel1  Allel2      descr
0  geneName1   sampleName1   Allel   allel2      tumor
1  geneName2   sampleName1   Allel   allel2      ntn
2  geneName3   sampleName1   Allel   allel2      ddd
3  geneName4   sampleName1   Allel   allel2      aga2
4  geneName1   sampleName2   Allel   allel2      tumorD
5  geneName2   sampleName2   Allel   allel2      ad2
6  geneName1   sampleName3   Allel   allel2      yyu
7  geneName2   sampleName3   Allel   allel2      hhf
8  geneName4   sampleName3   Allel   allel2      vgv
9  geneName5   sampleName3   Allel   allel2      aga5

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM