python - 提取组

标签 python python-3.x social-networking

使用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 处理。下面的代码演示了两者。相关的字符串方法是sortedjoin'/'.join 告诉 join 使用 / 作为连接项之间的分隔符。 tnamewriterow 语句中的列表之间的 + 运算符连接列表。 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 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/

相关文章:

python - 如何使用 conn.send() 向客户端发送数据

python - 如何通过唯一索引对 pandas 列求和,然后重置总和?

python - 无法安装包,因为未安装 pip

programming-languages - 如何开始建立一个新的社交网络?

python - Tkinter 使文本随时间变化

javascript - AJAX - 向用户显示连接的当前状态

python - Pytorch Transforms 的 Tensorflow 版本

python - 使用 Python folium 库将鼠标悬停在世界地图上时如何显示国家名称和人口?

r - 如何在 igraph 中提取社区的边缘列表?

design-patterns - 如何在社交网络中实现事件流