【发布时间】:2020-03-31 11:32:58
【问题描述】:
我在 Python 中有一个数据框 (df),它有 4 列(ID、Status、Person、Output)。每个 ID 重复 6 次,每个 ID 的输出相同。对于每个 ID,状态将为开/关(每个 3 个)。
我需要为每个唯一 ID/状态组合生成一个包含人员列表的新列。我还需要第二个新列,其中包含每个唯一人员列表的组 ID。
这是我当前的代码,由于 apply(list) 函数,它在处理大型数据帧时可以运行但速度很慢。有没有更有效的方法来做到这一点?
people = df.groupby(['ID','Status'])['Person'].apply(list).reset_index(name='Names_ID')
people['Group_ID'] = people['Names_ID'].rank(method='dense')
df = df.drop_duplicates(subset=['ID','Status'])
df = df.merge(people, on = ('ID', 'Status'))
这是一个示例输入数据框:
df=
ID Status Person Output
0 On John 1
0 On Mark 1
0 On Michael 1
0 Off Peter 1
0 Off Tim 1
0 Off Jake 1
1 On Peter 0.5
1 On Dennis 0.5
1 On Jasper 0.5
1 Off John 0.5
1 Off Mark 0.5
1 Off Michael 0.5
2 On John 2
2 On Mark 2
2 On Larry 2
2 Off Peter 2
2 Off Dennis 2
2 Off Jasper 2
想要的输出是:
df =
ID Status People Group_ID Output
0 On [John, Mark, Michael ] 0 1
0 Off [Peter, Tim, Jake ] 1 1
1 On [Peter, Dennis, Jasper ] 2 0.5
1 Off [John, Mark, Michael ] 0 0.5
2 On [John, Mark, Larry ] 3 2
2 Off [Peter, Dennis, Jasper ] 2 2
【问题讨论】: