如何基于另一个表[R或Python]对一个表中的多个列重新编码?

如何基于另一个表[R或Python]对一个表中的多个列重新编码?,python,r,pandas,dplyr,Python,R,Pandas,Dplyr,我的数据框有几个列,其中包含我想重新编码为整数的字符串值。共有20多列,每列都有其唯一的键值对,而且并非所有列都需要重新编码,因此我正在寻找一种方法来避免在任何时候写20多个case_,每个case_在3-6个case之间,这就是我目前阅读的3+个答案所建议的 我在另一个表中有字符串-整数对,我想知道是否有一种方法可以遍历数据列和键值对的行,重新编码字符串,如下所示: 数据: 键值对: Column_name String Int C2 D 5 C2

我的数据框有几个列,其中包含我想重新编码为整数的字符串值。共有20多列,每列都有其唯一的键值对,而且并非所有列都需要重新编码,因此我正在寻找一种方法来避免在任何时候写20多个case_,每个case_在3-6个case之间,这就是我目前阅读的3+个答案所建议的

我在另一个表中有字符串-整数对,我想知道是否有一种方法可以遍历数据列和键值对的行,重新编码字符串,如下所示:

数据:

键值对:

Column_name  String   Int
C2           D        5
C2           E        10
C2           F        0
C3           X        1
C3           Y        2
C3           Z        7   
输出:

C1  C2  C3
A   5   1
B   10  2
C   0   7
换句话说,对于每个数据列C,代码将只查看C的键值行,并用它们的值替换字符串

我对R或Python解决方案持开放态度。

这里有一种方法可以帮助您解决问题

在带有merge和rehsape2的R中


创建字典的另一种方法

d = {}
for c, s, i in zip(*map(pairs.get, pairs)):
    d.setdefault(c, {})[s] = i

df.replace(d)

  C1  C2  C3
0  A   5   1
1  B  10   2
2  C   0   7
有了R,我们就可以使用命名向量来完成这项工作,而无需在基R中使用任何包

df1[-1] <- Map(function(x, y) y[x], df1[-1], 
          with(df2, split(setNames(Int, String), Column_name)))

df1
#  C1 C2 C3
#1  A  5  1
#2  B 10  2
#3  C  0  7
此外,如果列是有序的,那么这将更加紧凑

df1[-1] <-  with(df2, setNames(Int, String))[as.matrix(df1[-1])]
没有任何空格,节省空间

df1[-1]<-with(df2,setNames(Int,String))[as.matrix(df1[-1])]
注意:这可以缩放到任意数量的列

数据 使用dplyr left_join:

图书馆弹琴 图书馆三年 数据%>% gatherColumn\u名称,字符串,-C1%>% 左键\u VAL%>% 选择字符串%>% 扩展列名称,Int 输出 C1 C2 C3 1 A 5 1 2 B 10 2 3C07 可以通过从“聚集”中排除更多变量来缩放此方法。例如,使用以下数据帧:


数据“字符串”中的值可能在不同的“列名称”组中重复。使用这个df.replace{k:dictzipd.String,d.Int代表k,d成对使用。groupby'Column_name'}@piRSquared-yep,注意这一点,只需更新:-,谢谢你,这在两种语言中都非常快!您,先生或女士,简直让我大吃一惊。@Khashir-yw:-快乐编码这种方法可以扩展到任意数量的列,而不是所有的列都需要重新编码吗?@Khashir-yes,如果您在初始聚集中包含这些列,我相信是这样。@Khashir我在回答中添加了一个示例,其中一些变量没有重新编码。没有一个现成的解决方案可能与实际数据有关;但这一次的逻辑帮助我找到了解决办法。因此,我选择了这个作为答案。哇,太简洁了。这会扩展到任意数量的列吗?不是所有列都需要重新编码吗?是的。它告诉replace仅替换字典指定的列。注意WeNYoBen的回答也一样。
df1[-1] <- Map(function(x, y) y[x], df1[-1], 
          with(df2, split(setNames(Int, String), Column_name)))

df1
#  C1 C2 C3
#1  A  5  1
#2  B 10  2
#3  C  0  7
df1[-1] <-  with(df2, setNames(Int, String))[as.matrix(df1[-1])]
df1[-1]<-with(df2,setNames(Int,String))[as.matrix(df1[-1])]
df1 <- structure(list(C1 = c("A", "B", "C"), C2 = c("D", "E", "F"), 
    C3 = c("X", "Y", "Z")), class = "data.frame", row.names = c(NA, 
-3L))

df2 <- structure(list(Column_name = c("C2", "C2", "C2", "C3", "C3", 
"C3"), String = c("D", "E", "F", "X", "Y", "Z"), Int = c(5L, 
10L, 0L, 1L, 2L, 7L)), class = "data.frame", row.names = c(NA, 
-6L))