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

Posted

技术标签:

【中文标题】如何合并来自上下文相关的两列的数据?【英文标题】:How to merge data from two columns which is context dependent? 【发布时间】:2017-05-09 14:25:05 【问题描述】:

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

输入文件在数据下方直到列 (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 相同的唯一值。

我对如何解决这个问题感到困惑。我想先建立一个字典列表,但是我在读取每一行时仍然会遇到一些问题,直到无法制作大块为止,然后我们开始读取其他块值以制作另一个最大块。

以下是部分解决方案:

我可以像这样创建另一个文件或数据对象:

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_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 = '.'

因此,此搜索和更新循环继续读取 file_1 中的第一行和 file_2 中的所有行;再次是 file_1 中的第 2 行和 file_2 中的所有行,直到两个文件中的所有行都完成为止。

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

【问题讨论】:

您能否创建一个输出数据框,向我们展示您想要的最终结果。 输入文件是上述数据直到列(PB)。输出文件只是根据 PB 和 PID 列中的信息将最后一列添加到输入文件中。 嗨@TedPetrou:你现在明白问题了吗?您可以看到 PID (5398) 在某些行中与 PB (1311) 相关联,这意味着任何具有 PID (5398) 但缺少 PB 的行实际上属于 PB (1311),因为 PID 之前已关联。 我只是在下面给出了一个简单的答案。这将附加与每个 PID 匹配的所有 PB。它将复制 PID 映射到多个 PB 的行 【参考方案1】:

似乎您只是用同一 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 周期具有相应的周期条目,则使用以下内容将它们设置回周期。

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

【讨论】:

这不是我想要的。我真的不知道如何解决这个问题。这是一个如此复杂的背景。 我可能可以使用唯一值合并它。 PB_PID_group = data_frame.groupby("PB")["PID"].unique()。但是,需要删除periods (.)。之后创建一个表并一起读取两个文件(逐行),然后使用 if then 更新最后一个块中的值。不过,我无法删除 pandas 中的句点。 上面的代码复制了非唯一值的行。 pos 值为 422 的行(以及其他类似的行)被复制了 3 次,更新了 3 个不同的块值。 如果每个 PID 都有非唯一的 PB,您想将哪个 PB 映射到每个 PID?最常发生的? “大 PB”是什么意思?最频繁、最多的数字?【参考方案2】:

我会为每个 PID 创建一个字典。每个 PID 的 PB 是否唯一?

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

【讨论】:

PB 在大多数情况下对于每个 PID 都是唯一的,但并非总是如此。那是我的主要问题。这只是大数据的一部分。 你能给我写个熊猫代码吗?我正在尽我最大的努力没有任何结果。 您想如何处理这些情况?也就是当一个PID有多个PB时怎么办?您只想继续将每个 PB 合并到每个 PID(即多对多合并)?

以上是关于如何合并来自上下文相关的两列的数据?的主要内容,如果未能解决你的问题,请参考以下文章

EXCEL中如何将两列的内容合并到一列中?

我们如何组合来自相同 data_type 的数据帧的两列的值并获取每个元素的计数?

比较来自两个不同表的两列的逗号分隔值

Dev中gridControl控件怎么讲某行的两列单元格合并

如何使用折线图以图形方式显示两个变量之间的相关性(来自同一 DataFrame 的两列)

连接来自两个不同表的两列