重新排列数据文件

时间:2017-07-26 22:23:04

标签: python

我正在尝试重新组织一个.txt文件,其中包含列中的特征和行上的族的数据列表。基本上,我需要编写一个程序来创建行,比较每个家庭中的人,以便比较人1和2,1和3,以及2和3的特征。即:

A 1 2 7 8 9 10
A 1 3 7 9 9 11
etc. 

其中A是家庭,前2个数字是人们比较,第3和第4个数字是trait1,例如每个人的测量值,最终数字是trait2,例如每个人的BMI值。

我的输入是这样的:

A 1 trait trait
A 2 trait trait
A 3 trait trait

我能够使用以下方法创建数据框:

data = pandas.read_csv('family.txt.', sep=" ", header = None)
print(data)

我似乎无法找到将数据连接到上面所需行的有效方法。任何帮助是极大的赞赏! 谢谢

1 个答案:

答案 0 :(得分:1)

好的,请考虑您的数据如下

file_lines = []
out_list = []
final_out = []

def read_file():
    global file_lines
    with open("sample.txt", 'r') as fd:
        file_lines = fd.read().splitlines()
    print file_lines

def make_output():
    global file_lines, out_list, final_out
    out_line = []
    for line1 in file_lines:
        for line2 in file_lines:
            line1c = line1.split(" ")
            line2c = line2.split(" ")
            if line1c[0] == line2c[0]:
                if line1c[1] >= line2c[1]:
                    continue
                else:
                    out_list = []
                    out_list.append(line1c[0])
                    out_list.append(line1c[1])
                    out_list.append(line2c[1])
                    for i in range(2, len(line1c)):
                        out_list.append(line1c[i])
                        out_list.append(line2c[i])
                print " ".join(out_list)

read_file()
make_output()

第一列是家庭,第二列是person_id,所有后续列都是特征。

下面的一些超级肮脏和超级匆忙编写的代码似乎可以提供你想要的东西

A 1 2 7 6 4 5 5 4 6 7
A 1 3 7 7 4 7 5 5 6 4
A 2 1 6 7 5 4 4 5 7 6
A 2 3 6 7 5 7 4 5 7 4
A 3 1 7 7 7 4 5 5 4 6
A 3 2 7 6 7 5 5 4 4 7
B 1 2 7 6 4 5 5 4 6 7
B 1 3 7 7 4 7 5 5 6 4
B 2 1 6 7 5 4 4 5 7 6
B 2 3 6 7 5 7 4 5 7 4
B 3 1 7 7 7 4 5 5 4 6
B 3 2 7 6 7 5 5 4 4 7

打印输出

A 1 2 7 6 4 5 5 4 6 7
A 1 3 7 7 4 7 5 5 6 4
A 2 3 6 7 5 7 4 5 7 4
B 1 2 7 6 4 5 5 4 6 7
B 1 3 7 7 4 7 5 5 6 4
B 2 3 6 7 5 7 4 5 7 4

正如您所见,在家庭中,人1与2和3进行比较.2与1和3进行比较,3与1和2进行比较。

显然会有重复,因为每个人都会与家里的其他人进行两次比较。

通过维护与谁进行比较的人员清单来消除这一点是微不足道的。

P.S: 我知道剧本很脏,但我只是想说明我做了什么。不写生产代码

编辑: 我想编写一个稍微复杂一点的重复删除程序。但由于数据如此简单,继续标准中的一个小修改解决了它。此编辑后的输出是

{{1}}

没有重复