将数据帧列中的某些多个值重命名为另一个值

时间:2016-08-01 14:40:41

标签: python r pandas numpy

我有一个数据帧,大小为1 GB,以下是虚拟的

df <- data.frame(group=rep(c("A", "B", "C","D","E","F","G","H"), each=4),height=sample(100:150, 16))
df
   group height
1      A    105
2      A    119
3      B    108
4      B    114
5      C    109
6      C    111
7      D    148
8      D    121
9      E    133
10     E    101
11     F    143
12     F    135
13     G    147
14     G    141
15     H    150
16     H    145

而我的目标是将列组的名称更改为NC,将所有B,H和G更改为NC,将所有A更改为PC,其他更改为NON 所以我尝试了下面的单行。

de=c("B")
df =df$group[df$group %in% de,]<-"NC"

但它引发了以下错误,

Error in `[<-.factor`(`*tmp*`, df$group %in% de, , value = "nc") : 
  incorrect number of subscripts on matrix
In addition: Warning message:
In `[<-.factor`(`*tmp*`, df$group %in% de, , value = "nc") :
  invalid factor level, NA generated

最后,数据框df应如下所示

df
   group height
1      PC    105
2      PC    119
3      NC    108
4      NC   114
5      NON    109
6      NON    111
7      NON    148
8      NON    121
9      NON    133
10     NON    101
11     NON    143
12     NON   135
13     NC    147
14     NC    141
15     NC    150
16     NC    145

R或熊猫的任何建议都会非常棒。 谢谢

3 个答案:

答案 0 :(得分:1)

带有numpy.where和布尔值掩码的Pandas / Numpy解决方案:

print (df['group'] =='B')
1     False
2     False
3     False
4     False
5      True
6      True
7      True
8      True
9     False
10    False
11    False
12    False
Name: group, dtype: bool

df['group'] = np.where(df['group'] == 'B','NC','PC')
print (df)

   group  height
1     PC     113
2     PC     118
3     PC     128
4     PC     143
5     NC     109
6     NC     141
7     NC     142
8     NC     129
9     PC     127
10    PC     102
11    PC     108
12    PC     107

np.where的解决方案:

df['group'] = np.where(df['group'].isin(['B','G','H']), 'NC',
              np.where(df['group'] == 'A', 'PC', 'NON'))

print (df)
   group  height
1     PC     105
2     PC     119
3     NC     108
4     NC     114
5    NON     109
6    NON     111
7    NON     148
8    NON     121
9    NON     133
10   NON     101
11   NON     143
12   NON     135
13    NC     147
14    NC     141
15    NC     150
16    NC     145

答案 1 :(得分:1)

在R中你可以尝试:

首先转换为字符,然后直接替换该值。

df$group <- as.character(df$group); 
df$group[df$group %in% c("B")] <- "NC"

编辑:

在您更新问题时,您可以尝试ifelse。当然,您也可以通过此方法覆盖group列。

df$group2 <- ifelse( df$group %in% c("B", "H", "G"), "NC", ifelse(df$group %in% c("A"), "PC", "NON"))
head(df, 10)
   group height group2
1      A    139     PC
2      A    114     PC
3      A    132     PC
4      A    141     PC
5      B    107     NC
6      B    101     NC
7      B    122     NC
8      B    129     NC
9      C    100    NON
10     C    108    NON

答案 2 :(得分:0)

您也可以将组名替换为

    df$group=as.character(df$group)
    df$group[c(3:4,13:16)]='NC'
    df$group[c(1:2)]='PC'
    df$group[c(5:12)]='NON'