使用Python 3.2我希望解决以下问题。我的数据由数百行(表示一个项目)和 21 列组成。其中第一列是唯一的项目 ID,其他 20 列是领导该项目的一组人或个人。 person_1 总是被填满,如果 person_3 中有一个名字,则意味着 3 个人正在一起工作。如果 person_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 保留在组名称的开头,但如果适用(即,如果项目中有超过 1 人),则将 person_2 到 person_20 按字母顺序排列。
感谢您的帮助和建议
最佳答案
前面的答案给出了明确的方法说明,但也许您陷入了字符串处理或 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 7lines
并在文件 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:])
产生
“乔/莎莉/////”
,同时
'/'.join(filter(lambda x: x, row[1:]))
和
'/'.join(x for x in row[1:] if x)
和
'/'.join(filter(len, row[1:]))
产生
“乔/莎莉”
.
关于python - 提取组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13000121/