如何将分类数据折叠成 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
已经排序)。
我有一个以这种方式构造的数据集:
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
已经排序)。