提取组

时间:2012-10-21 17:09:36

标签: python python-3.x social-networking

使用Python 3.2我希望解决以下问题。我的数据包含数百行(表示项目)和21列。第一个是唯一的项目ID,其他20个列是领导该项目的人员或人员组。 person_1总是被填满,如果有人名3,那意味着3个人在一起工作。如果有人名18,这意味着18个人在一起工作。

我有一个excel电子表格,其设置方式如下:

 unique ID person_1      person _2      person_3     person_4   ...  person_20
    12       Tom           Sally          Mike
    16       Joe           Mike
    5        Joe           Sally
    1       Sally          Mike           Tom
    6       Sally          Tom            Mike
    2       Jared          Joe            Mike        John      ...     Carl

我想做一些事情:

1)创建一个列,它将为我提供一个唯一的“组名”,使用唯一的ID 1作为我的例子,Sally / Mike / Tom。所以它将是以'/'分隔的名称。

2)从我的例子中,我如何对待Sally / Mike / Tom和Sally / Tom / Mike一样。意思是,我想要另一个列,使组名按字母顺序排列(无论实际排列),仍以'/'分隔。

3)这个问题类似于(2)。但是,我希望person_1中列出的人员很重要。意思是Joe / Tom / Mike与Tom / Joe / Mike不同,但与Joe / Mike / Tom没什么不同。因此,会有另一列将person_1保留在组名称的开头,但是如果适用的话,将person_2按字母顺序排列到person_20(即,如果项目上有超过1个人)。

感谢您的帮助和建议

2 个答案:

答案 0 :(得分:1)

您可以执行以下操作:

  1. 将文件导出到Excel中的.csv文件
  2. 使用csv
  3. 使用python的csv.reader模块打开该输入文件
  4. 使用csv.writer
  5. 打开另一个文件(输出)以写入它
  6. 对读者中的每一行进行迭代,进行治疗,然后使用作者写下
  7. 在Excel中导入输出文件

答案 1 :(得分:1)

前面的回答明确说明了方法,但是你可能会遇到字符串处理或csv处理。两者都在以下代码中演示。相关字符串方法为sortedjoin'/'.join告诉join使用/作为已加入项目之间的分隔符。 +tname语句中列表之间的writerow运算符连接列表。 csv.reader是一个迭代器,每行传递一个列表,csv.writer将列表转换为行并将其写出。您将需要将错误测试添加到文件打开等。用于测试此代码的数据文件显示在代码之后。

import csv
fi = open('xgroup.csv')
fo = open('xgroup3.csv', 'w')
w = csv.writer(fo)
r = csv.reader(fi)
li = 0
print "Opened reader and writer"
for row in r:
    gname = '/'.join(row[1:])
    sname = '/'.join(sorted(row[1:]))
    tname = '/'.join([row[1]]+sorted(row[2:]))
    w.writerow([row[0], gname, sname, tname]+row[1:])
    li += 1
fi.close()
fo.close()
print "Closed reader and writer after",li,"lines"

接下来会显示文件xgroup.csv

unique-ID,person_1,person,_2,person_3,person_4,...,person_20
12,Tom,Sally,Mike
16,Joe,Mike
5,Joe,Sally
1,Sally,Mike,Tom
6,Sally,Tom,Mike
2,Jared,Joe,Mike,John,...,Carl

在阅读上述数据后,程序会打印Opened reader and writerClosed reader and writer after 7 lines,并在文件xgroup3.csv中生成输出,如下所示。

unique-ID,person_1/person/_2/person_3/person_4/.../person_20,.../_2/person/person_1/person_20/person_3/person_4,person_1/.../_2/person/person_20/person_3/person_4,person_1,person,_2,person_3,person_4,...,person_20
12,Tom/Sally/Mike,Mike/Sally/Tom,Tom/Mike/Sally,Tom,Sally,Mike
16,Joe/Mike,Joe/Mike,Joe/Mike,Joe,Mike
5,Joe/Sally,Joe/Sally,Joe/Sally,Joe,Sally
1,Sally/Mike/Tom,Mike/Sally/Tom,Sally/Mike/Tom,Sally,Mike,Tom
6,Sally/Tom/Mike,Mike/Sally/Tom,Sally/Mike/Tom,Sally,Tom,Mike
2,Jared/Joe/Mike/John/.../Carl,.../Carl/Jared/Joe/John/Mike,Jared/.../Carl/Joe/John/Mike,Jared,Joe,Mike,John,...,Carl

注意,给出一个像

这样的数据线
5,Joe,Sally,,,,,

而不是

5,Joe,Sally

上述程序产生

5,Joe/Sally/////,/////Joe/Sally,Joe//////Sally,Joe,Sally,,,,,

而不是

5,Joe/Sally,Joe/Sally,Joe/Sally,Joe,Sally

如果这是一个问题,请过滤掉空条目。例如,如果是 那么row=['5', 'Joe', 'Sally', '', '', '', '', ''] '/'.join(row[1:])生成
'Joe/Sally/////',而
'/'.join(filter(lambda x: x, row[1:]))
'/'.join(x for x in row[1:] if x)
'/'.join(filter(len, row[1:]))生成
'Joe/Sally'