如何合并上下文相关的两列数据?

2024-04-27 20:14:57 发布

您现在位置:Python中文网/ 问答频道 /正文

在具有以下数据结构的文件中:

在列(PB)之前,输入文件位于数据下方。

contig  pos    GT    PGT       PID     PG      PB     updated_Block
2      5426    0/1   0|1       5398   1|0   1311       1311 
2      5427    0/1   0|1       5398   0/1   .          1311
2      5434    0/1   0|1       5398   1|0   1311       1311
2      5454    0/1   0|1       5398   0/1   .          1311
2      5457    0/0   .          .     0/0   .          .
2      5467    0/1   0|1       5467   0|1   1311       1311
2      5480    0/1   0|1       5467   0|1   1311       1311
2      5483    0/0   0|1       5482   0/0   1667       1667
2      5518    1/1   1|1       5467   1/1   .          1311
2      5519    0/0   .         .      0/0   .          .
2      5547    1/1   1|1       5467   1/1   .          1311
2      5550    ./.   .         .      ./.   .          .
2      5559    1/1   1|1       5467   1/1   .          1311
2      5561    0/0   .         .      0/0   .          .
2      5576    0/1   0|1       5576   1|0   1311       1311
2      5599    0/1   0|1       5576   1|0   1311       1311
2      5602    0/0   .         .      0/0   .          .
2      5657    0/1   .         .      1|0   1311       1311
2      5723    0/1   .         .      1|0   1311       1311
2      6414    0/1   .         .      0|1   1667       1667
2      6446    0/1  0|1      6446     0|1   1667       1667
2      6448    0/1  0|1      6446     0|1   1667       1667
2      6465    0/1  0|1      6446     0|1   1667       1667
2      6636    0/1  .          .      1|0   1667       1667
2      6740    0/1  .        6740     0|1   1667       1667

输出文件是输入数据加上最后一列(我需要计算)。

PID表示块,PGT表示该块中由一个特定程序生成的一个数据。 另一个程序为相同的数据集生成相同类型的信息-PB是块,PG是块中的数据之一。这两个程序根据不同的概率测试发出值和块信息。

因此,从上述数据输出:属于块PB(1311)的数据来自与PID(5398、5467和5576)相同的块。我只需要合并尽可能多的块,使尽可能大的块。所以,我只需要找到重叠的块并合并它们来创建一个更大的块集。更新后的块应该看起来像最后一列(我手工输入)。

详情: 来自PB的1311与来自PID的5398、5467、5576重叠-因此它们形成了一个大的块。您可以看到PID(5398)在某些行中与PB(1311)相关联,这意味着任何具有PID(5398)但缺少PB的行实际上都属于PB(1311),因为PID以前与PB(1311)相关联。更新后的块可以具有与PB相同的唯一值。你知道吗

我对如何处理这个问题感到困惑。我想先建立一个字典列表,但是在没有大的块之前,我仍然会有一些问题,在读取每一行时,然后我们开始读取其他块的值来生成另一个最大的块。你知道吗

以下是部分解决方案:

我可以创建另一个文件或数据对象,如下所示:

PB_PID_group = data_frame.groupby("PI")["PID"].unique()

这给了我:

PI
.             [., 5398, 5482, 5467]
1311    [5185, ., 5398, 5467, 5576]
1667                      [., 6446]
3352                            [.]
935                             [.]
Name: PID, dtype: object

我必须删除上面输出中的第一行和其他行中的periods(.)但是,这仍然不是表格式的数据。我还需要解决这个问题。

所以,现在我加载两个文件并逐行读取这两个文件:

file_1 = file_1.split('\n')
file_2 = file_2.split('\n')

for line in file_1 and file_2:

    again split lines by tabs and then

    PB_file1 = file_1[6]
    PID_file1 = file_1[4]

    PB_file2 = file_2[0]
    PID_file2 = file_2[1].split(', ')

现在,我搜索并更新update\u PB中的值

    if PB_file1 is an integer:
        update_PB = PB_file1
    elif:
        PB_file1 = '.'
        if PID_file1 in PID_file2:
            update_PB = PB_file2
    else:
        update_PB = '.'

因此,这个搜索和更新循环通过读取文件\u 1中的第一行和文件\u 2中的所有行来继续;再次读取文件\u 1中的第二行和文件\u 2中的所有行,并继续,直到两个文件中的所有行都完成。你知道吗

任何建议。有什么帮助吗?你知道吗


Tags: 文件数据in程序信息piupdatepid
2条回答

我只需要为每个PID创建一个字典。每个PID的PB是唯一的吗?你知道吗

您可以按PIDPB分组,删除重复项和nan值(如果有)。然后将有一个表PID PB来创建所需的列。你知道吗

似乎你只是在用同一个PID组上的随机PB替换周期。你知道吗

df.groupby('PID')['PB'].transform(lambda x: x.replace('.', x.sort_values()[-1]))

从你上次的评论看来,你只是想要每个PID组的最大值。你知道吗

df['updated_Block'] = df.groupby('PID')['PB'].transform('max')

如果需要使PID periods有一个对应的period条目,那么使用以下命令将它们设置回period。你知道吗

df.loc[df['PID'] == '.', 'updated_Block'] = '.'

相关问题 更多 >