【问题标题】:fill missing rows in a dataframe [duplicate]填充数据框中缺失的行[重复]
【发布时间】:2017-08-14 03:16:38
【问题描述】:

我有一个如下所示的数据框

   Hair   Eye    Freq
1  Black Brown      32
2  Brown Brown      53
3    Red Brown      10
4  Blond Brown       3
5    Red  Blue      10
6  Blond  Blue      30
7  Black Hazel      10
8  Blond Hazel       5

在上面的数据帧中,4 种头发颜色Black, Brown, Red and Blond 的频率在不同的眼睛颜色Brown, Blue and Hazel 中被记录下来。但是,我想为相应的眼睛颜色填充缺失的头发颜色频率,以便生成如下数据框。任何帮助表示赞赏。

   Hair   Eye    Freq
1  Black Brown      32
2  Brown Brown      53
3    Red Brown      10
4  Blond Brown       3
5  Black  Blue      0
6  Brown  Blue      0
7    Red  Blue      10
8  Blond  Blue      30
9  Black Hazel      10
10 Brown Hazel      0
11   Red Hazel      0
12 Blond Hazel      5

【问题讨论】:

  • @akrun 现在也添加了一个 python 目标

标签: python r dataframe


【解决方案1】:

如果我们使用R,一个选项是complete from tidyr

library(tidyr)
complete(df1, Hair, Eye, fill = list(Freq = 0)) %>%
      arrange(factor(Eye, levels = unique(df1$Eye)), factor(Hair, levels = unique(df1$Hair)))
# A tibble: 12 × 3
#    Hair   Eye  Freq
#   <chr> <chr> <dbl>
#1  Black Brown    32
#2  Brown Brown    53
#3    Red Brown    10
#4  Blond Brown     3
#5  Black  Blue     0
#6  Brown  Blue     0
#7    Red  Blue    10
#8  Blond  Blue    30
#9  Black Hazel    10
#10 Brown Hazel     0
#11   Red Hazel     0
#12 Blond Hazel     5

【讨论】:

  • 你是一颗宝石。我花了一整天...你让它看起来很简单。没听过完整的功能。谢谢
  • 为什么需要使用list(Freq = 0) 而不仅仅是Freq = 0。 ?
  • @user5249203 我认为是考虑多个变量
【解决方案2】:

使用expand.grid 创建一个包含头发和眼睛颜色组合的新表。然后使用join方法将df1的频率绑定到df2。最后移除 NA。

library('data.table')
hair <- c('Black', 'Brown', 'Red', 'Blond')  # hair colors
eye <- c('Brown', 'Blue', 'Hazel')           # eye colors
df2 <- expand.grid(Hair = hair, Eye = eye)   # data frame with combinations of eye and hair colors
setDT(df2)[df1, `:=` (Freq = i.Freq), on = .(Hair, Eye)]  # join df2 with df1 based `on = .(Hair, Eye)` and bind `Freq` from df1 to df2
df2[is.na(Freq), Freq := 0 ]                # remove NA with 0

输出:

df2
#     Hair   Eye Freq
# 1: Black Brown   32
# 2: Brown Brown   53
# 3:   Red Brown   10
# 4: Blond Brown    3
# 5: Black  Blue    0
# 6: Brown  Blue    0
# 7:   Red  Blue   10
# 8: Blond  Blue   30
# 9: Black Hazel   10
# 10: Brown Hazel    0
# 11:   Red Hazel    0
# 12: Blond Hazel    5

数据:

df1 <- fread('id   Hair   Eye    Freq
1  Black Brown      32
2  Brown Brown      53
3    Red Brown      10
4  Blond Brown       3
5    Red  Blue      10
6  Blond  Blue      30
7  Black Hazel      10
8  Blond Hazel       5')

df1[, id:=NULL]

【讨论】:

    【解决方案3】:

    一个基本的 R 选项是使用 expand.gridHairEyemerge 的每个组合创建另一个数据框与原始数据框。

    merge(expand.grid(Hair=unique(df$Hair),Eye=unique(df$Eye)), df[-1], all.x = TRUE)
    
    #    Hair   Eye Freq
    #1  Black  Blue   NA
    #2  Black Brown   32
    #3  Black Hazel   10
    #4  Blond  Blue   30
    #5  Blond Brown    3
    #6  Blond Hazel    5
    #7  Brown  Blue   NA
    #8  Brown Brown   53
    #9  Brown Hazel   NA
    #10   Red  Blue   10
    #11   Red Brown   10
    #12   Red Hazel   NA
    

    上面的结果给出了NA,我们可以很容易地将那些NA转换为0

    df1 <- merge(expand.grid(Hair = unique(df$Hair), Eye = unique(df$Eye)), df[-1], 
                                                                  all.x = TRUE)
    df1[is.na(df1)] <- 0
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-27
      • 1970-01-01
      • 2018-12-17
      • 2018-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多