使用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个人)。
感谢您的帮助和建议
答案 0 :(得分:1)
您可以执行以下操作:
.csv
文件csv
csv.reader
模块打开该输入文件
csv.writer
答案 1 :(得分:1)
前面的回答明确说明了方法,但是你可能会遇到字符串处理或csv处理。两者都在以下代码中演示。相关字符串方法为sorted
和join
。 '/'.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 writer
和Closed 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'
。