【问题标题】:Iterate column for matches in another column为另一列中的匹配项迭代列
【发布时间】:2019-09-09 19:43:17
【问题描述】:

我的文件看起来像:

chr1:92092600   G[chr2:164084669[   ENSG00000189195 ENST00000342818 BTBD8   chr2:164084669
chr1:121498879  T[chr9:2781522[ ENSG00000233432 ENST00000425455 AL592494.2  chr9:2781522
chr2:101298260  ]chr3:196435392]A   ENSG00000163162 ENST00000295317 RNF149  chr3:196435392
chr2:164084669  ]chr1:92092600]G    ENSG00000237844 ENST00000429636 AC016766.1  chr1:92092600
chr9:2781522    ]chr1:121498879]T   ENSG00000080608 ENST00000490444 PUM3    chr1:121498879
chr3:196435392  A[chr2:101298260[   ENSG00000163960 ENST00000296328 UBXN7   chr2:101298260

对于第 6 列中的每个元素,我想搜索第 1 列,如果存在 - 打印整行。因此,第 6 列中前 3 个元素的预期输出应如下所示:

chr2:164084669  ]chr1:92092600]G    ENSG00000237844 ENST00000429636 AC016766.1  chr1:92092600
chr9:2781522    ]chr1:121498879]T   ENSG00000080608 ENST00000490444 PUM3    chr1:121498879
chr3:196435392  A[chr2:101298260[   ENSG00000163960 ENST00000296328 UBXN7   chr2:101298260

到目前为止我有:

import pandas as pd

pd.options.display.max_colwidth = 100
file =  open("data.txt", 'r')

chrA =[]
chrB = []
Bgenes = []

for line in file.readlines():
    chrA.append(line.split()[0])
    chrB.append(line.split()[5])
    for pos in chrB:
        if pos in chrA: 
            Bgenes.append(line)

【问题讨论】:

  • 如果数据甚至没有进入数据框,为什么还要导入pandas
  • 也不是第6列的每个元素都在第1列吗?

标签: python pandas


【解决方案1】:

您还可以使用列表推导来查找匹配项:

with open('data.txt', 'r') as f:
    lines = [line.split() for line in f.readlines()]

for line in lines:
    try:
        i = [x[0] for x in lines].index(line[5])
        print(' '.join(lines[i]))
    except IndexError:
        pass

输出:

chr2:164084669 ]chr1:92092600]G ENSG00000237844 ENST00000429636 AC016766.1 chr1:92092600
chr9:2781522 ]chr1:121498879]T ENSG00000080608 ENST00000490444 PUM3 chr1:121498879
chr3:196435392 A[chr2:101298260[ ENSG00000163960 ENST00000296328 UBXN7 chr2:101298260
chr1:92092600 G[chr2:164084669[ ENSG00000189195 ENST00000342818 BTBD8 chr2:164084669
chr1:121498879 T[chr9:2781522[ ENSG00000233432 ENST00000425455 AL592494.2 chr9:2781522
chr2:101298260 ]chr3:196435392]A ENSG00000163162 ENST00000295317 RNF149 chr3:196435392

【讨论】:

  • 太好了,谢谢@Alderven!还有一个问题,对于第 1 列中不存在的第 6 列中的每个元素,您可以添加一个空白行吗?
  • 或者,也许这不是必需的......我想将输出合并回 indata,也许这可以用 pandas concat 来完成,所以产生 NaN 而不是空行。
【解决方案2】:

首先把你的数据放到一个pandas DataFrame中,然后你就可以用这个了:

import pandas as pd

df = pd.DataFrame({"a": ["asdf", "qwer", "zxcv"],
                   "b": ["b_row_1", "b_row_2", "b_row_3"],
                   "c": ["ghjk", "qwer", "zxcv"]})

for index, row in df.iterrows():
    if row["c"] not in df["a"].tolist():
        df = df.drop(index)

输出应如下所示:

      a        b     c
1  qwer  b_row_2  qwer
2  zxcv  b_row_3  zxcv

您可以使用类似的方法将文件作为 pandas DataFrame 读取:

data = pd.read_csv('output_list.txt', sep=" ", header=None)
data.columns = ["a", "b", "c", "etc."]

检查这些链接:

Load data rom txt with pandas

How to iterate over rows in a datarame in pandas

Pandas dataframe drop

【讨论】:

  • 不要使用iterrows,因为这违背了pandas的目的
【解决方案3】:

你需要使用一个单独的“for”循环来收集和另一个循环来搜索。

lines=file.readlines()
for line in lines: 
    for line2 in lines:
         if line.split()[5] ==line2.split()[0]:
             Bgenes.append(line2)

我希望这会有所帮助:)

【讨论】:

    【解决方案4】:

    我假设您的数据可以用逗号分隔(您可以添加)。原因是您的原始数据具有不同数量的空白。这是我猜你想要的结果的代码和屏幕截图。

    import pandas as pd
    data1 = pd.read_csv('C:/data.csv', sep=',', header=None)
    data2 = pd.read_csv('C:/data.csv', sep=',', header=None)
    df1=pd.DataFrame(data1) # create FIRST dataframe
    df2=pd.DataFrame(data2) # create SECODN dataframe
    
    df1.columns=['1','2','3','4','5','ID'] #assinging ID to column 6
    df2.columns=['ID','2','3','4','5','6'] #assingning ID to column 1
    
    dfMerged1=pd.merge(df1, df2, on='ID', how='inner') 
    dfMerged2=pd.merge(df2, dfMerged1, on='ID', how='inner')
    
    dfCleaned=dfMerged2.iloc[:,0:6] #what you want at the end
    print(dfCleaned)
    

    【讨论】:

      猜你喜欢
      • 2015-09-29
      • 2021-10-08
      • 1970-01-01
      • 2021-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-20
      • 2018-11-22
      相关资源
      最近更新 更多