如何将分类数据折叠成 R 或 Python 中的单个记录?

How do I collapse categorical data into a single record in R or Python?

我有一个以这种方式构造的数据集:

ID   Code
1     A
1     B   
1     C
2     A
2     C
3     B
3     C

不过,我希望它看起来像:

ID  Codes
1   A B C
2   A C
3   B C

在 R 或 Python 中是否有一种简单的方法可以做到这一点? 谢谢!

R中,你可以做到

aggregate(Code~ID, df1, paste, collapse=' ')
#    ID  Code
#1  1  A B C
#2  2    A C
#3  3    B C

或者

library(data.table)
setDT(df1)[, list(Code=paste(Code, collapse= ' ')), ID]

数据

df1 <- structure(list(ID = c(1L, 1L, 1L, 2L, 2L, 3L, 3L), 
Code = c("A", 
"B", "C", "A", "C", "B", "C")), .Names = c("ID", "Code"),
class =    "data.frame", row.names = c(NA, -7L))

在 Python 和 Pandas 中,您可以:

import pandas as pd

df = pd.read_clipboard() # from your sample

df
   ID Code
0   1    A
1   1    B
2   1    C
3   2    A
4   2    C
5   3    B
6   3    C

df.groupby('ID').agg(lambda x: ' '.join(x['Code']))

     Code
ID       
1   A B C
2     A C
3     B C

纯Python:

>>> ID = [1,1,1,2,2,3,3]
>>> code = ['A','B','C','A','C','B','C']
>>> data = {id:[] for id in set(ID)}
>>> for id, code in zip(ID, code):
...     data.get(id).append(code)
...
>>> data
{1: ['A', 'B', 'C'], 2: ['A', 'C'], 3: ['B', 'C']}

使用data.table:

require(data.table)
ans = setDT(df)[, .(Codes = paste(Code, collapse=" ")), by=ID]
#    ID Codes
# 1:  1 A B C
# 2:  2   A C
# 3:  3   B C

ans$Codes # is a character vector

这会导致粘贴值,这可能并不总是最好的方法。或者,您也可以将它们作为列表列..

ans = setDT(df)[, .(Codes = list(Code)), by=ID]
#    ID Codes
# 1:  1 A,B,C
# 2:  2   A,C
# 3:  3   B,C

ans$Codes # is a list

请注意,组的顺序将保留在聚合结果中(此示例数据中并不明显,因为 ID 已经排序)。