1

使用 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。

感谢您的帮助和建议

4

2 回答 2

1

上一个答案给出了明确的方法说明,但也许您被困在字符串处理或 csv 处理上。两者都在以下代码中进行了演示。相关的字符串方法是sortedjoin'/'.join告诉join用作/连接项之间的分隔符。和语句中的列表之间的+运算符连接列表。A是一个迭代器,每行传递一个列表,a将列表转换为行并将其写出。您将需要在文件打开等中添加错误测试。用于测试此代码的数据文件显示在代码之后。tnamewriterowcsv.readercsv.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

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

于 2012-10-21T21:01:27.297 回答
1

您可以执行以下操作:

  1. .csv将文件从 Excel导出到文件
  2. csv使用 python 的模块打开该输入文件,使用csv.reader
  3. 打开另一个文件(输出)以写入它使用csv.writer
  4. 遍历阅读器中的每一行,进行处理,然后使用编写器进行编写
  5. 在 Excel 中导入输出文件
于 2012-10-21T17:50:04.443 回答