基于3美元和2美元将数据分为三组(正面,负面)(正面,正面)(负面,负面)

时间:2014-07-17 07:50:26

标签: python bash perl awk categories

如果我们有输入

95 cpd-1 -3.21 ooo
56 cpd-1  1.21 ooo
77 cpd-1  2.2  ooo 
93 cpd-2  2.0  oox
57 cpd-2  1.15 oox
85 cpd-3 -1.32 xxx
67 cpd-3 -2.22 xxx
58 cpd-4  0    oxo
65 cpd-4  1.23 oxo

我们希望根据以下规则将输入分成三个文件:

(1)如果列2中的行相同

(2)将这些行分为三类:第3列是(正面,负面)(正面,正面)(负面,负面)

(3)我们将第3列中的0计为“正”

(4)对于相同的第2列,它们的第1列肯定是不同的

(5)对于相同的第2列,它们的第4列肯定是相同的

我们唯一能想到的是计算减号“ - ”。在(正面,正面),(正面,负面),(负面,负面),没有。相应地减去= 1,2,3并基于此来做类别。

欲望输出是:(不需要打印出来((正面,正面))等等。

(正,正)

93 cpd-2  2.0  oox
57 cpd-2  1.15 oox
58 cpd-4  0    oxo
65 cpd-4  1.23 oxo

(正,负)

95 cpd-1 -3.21 ooo
56 cpd-1  1.21 ooo
77 cpd-1  2.2  ooo 

(负,负)

85 cpd-3 -1.32 xxx
67 cpd-3 -2.22 xxx

我们希望看看是否有任何评论/解决方案或内置bash / awk / python / perl / etc。功能可以做到这一点,我们不知道。谢谢!

1 个答案:

答案 0 :(得分:1)

我认为您需要执行两阶段过滤器,因为您需要按列2执行初始分组,然后检查第3列的值。初始分组应填充字典,可能是第2列值可能会有很大差异:

grouped_rows = {}
for row in rows:
    second_column = row.split(" ")[1]
    if second_column in grouped_rows:
        grouped_rows[second_column].append(row)
    else:
        grouped_rows[second_column] = [row]

然后,您需要确定给定组中是否存在正值或负值:

def row_value(row):
    return float(row.split(" ")[2])

for rows in grouped_rows.values():
    has_positive = any([ row_value(row) >= 0 for row in rows ])
    has_negative = any([ row_value(row) < 0 for row in rows ])

    if has_positive and not has_negative:
        write_rows(file_1, rows)
    elif has_positive and has_negative:
        write_rows(file_2, rows)
    else:
        write_rows(file_3, rows)