[英]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
正如你所看到的,有些行没有GS1
, GS2
数据,但都有一个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.