同时填充2个数据框列?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了同时填充2个数据框列?相关的知识,希望对你有一定的参考价值。

我有一个数据框,每行最多具有4对不同的地理坐标。包含它们的字段是LAT1&LONG1,LAT2&LONG2,LAT3&LONG3和LAT4&LONG4。这些完整性有所不同-某些值通常为NA。我想创建列“ LAT”和“ LONG”,并用其中第一个都不是NA的坐标的第一个pair填充这些列。我检查的顺序将是1、2、3、4。例如,我的数据可能看起来像这样:

ORD LAT1 LONG1     LAT2     LONG2     LAT3     LONG3     LAT4     LONG4
1   NA   NA       NA        NA        44.65783 -65.86633 44.68800 -65.80183
2   NA   NA       NA        NA        44.67033 -65.81833 44.67333 -65.84767
3   NA   NA       44.19133  -63.32017 44.25583 -63.27117 NA        NA
4   NA   NA       44.25717  NA        44.30950 -63.18617 NA        NA
5   NA   NA       44.30667  -63.17550 44.35483 -63.08717 NA        NA
6   NA   NA       44.35433  -63.07267 44.30633 -63.12117 NA        NA

而且我想以此结尾:

ORD LAT1 LONG1     LAT2     LONG2     LAT3     LONG3     LAT4     LONG4      LAT       LONG
1   NA   NA       NA        NA        44.65783 -65.86633 44.68800 -65.80183  44.65783  -65.86633
2   NA   NA       NA        NA        44.67033 -65.81833 44.67333 -65.84767  44.67033  -65.81833
3   NA   NA       44.19133  -63.32017 44.25583 -63.27117 NA        NA        44.19133  -63.32017
4   NA   NA       44.25717  NA        44.30950 -63.18617 NA        NA        44.30950  -63.18617
5   NA   NA       44.30667  -63.17550 44.35483 -63.08717 NA        NA        44.30667  -63.17550
6   NA   NA       44.35433  -63.07267 44.30633 -63.12117 NA        NA        44.35433  -63.07267

我实际上已经通过下面的2个ifelse块实现了这一目标,并且它们正在按照我想要的方式工作:

set_df$LAT <- ifelse(is.na(set_df$LAT1) | is.na(set_df$LONG1),
                      ifelse(is.na(set_df$LAT2) | is.na(set_df$LONG2),
                          ifelse(is.na(set_df$LAT3) | is.na(set_df$LONG3), set_df$LAT4,set_df$LAT3),
                      set_df$LAT2),
                  set_df$LAT1)
set_df$LONG <- ifelse(is.na(set_df$LAT1) | is.na(set_df$LONG1),
                         ifelse(is.na(set_df$LAT2) | is.na(set_df$LONG2),
                                ifelse(is.na(set_df$LAT3) | is.na(set_df$LONG3), set_df$LONG4,set_df$LONG3),
                         set_df$LONG2),
                   set_df$LONG1)

所以我在这里的原因是,这让我感到效率低下,因为我本质上是在确定我想要两次的一对坐标对-第一个块仅捕获LAT,第二个块捕获长。

有没有一种方法可以同时获取两个值并将它们立即弹出到新列中?我非常希望仅使用基本R解决方案。

edit:这里使用@ user2974951的方法,但是具有命名字段和所需的输出:

    tmp=apply(set_df,1,function(x)
      if (!is.na(x["LAT1"]) & !is.na(x["LONG1"])) return(c(x[test1="LAT1"],x["LONG1"]))
      else if (!is.na(x["LAT2"]) & !is.na(x["LONG2"])) return(c(x["LAT2"],x["LONG2"]))
      else if (!is.na(x["LAT3"]) & !is.na(x["LONG3"])) return(c(x["LAT3"],x["LONG3"]))
      else return(c(x["LAT4"],x["LONG4"]))
    )
    set_df = cbind(set_df,t(tmp))
    colnames(set_df)[colnames(set_df)=="1"] <- "LAT"
    colnames(set_df)[colnames(set_df)=="2"] <- "LONG"
答案

这里是使用Apply的替代解决方案

tmp=apply(dat,1,function(x)
  if (!is.na(x[2]) & !is.na(x[3])) return(c(x[2],x[3]))
  else if (!is.na(x[4]) & !is.na(x[5])) return(c(x[4],x[5]))
  else if (!is.na(x[6]) & !is.na(x[7])) return(c(x[6],x[7]))
  else return(c(x[8],x[9]))
)

cbind(dat,t(tmp))

  ORD LAT1 LONG1     LAT2     LONG2     LAT3     LONG3     LAT4     LONG4        1         2
1   1   NA    NA       NA        NA 44.65783 -65.86633 44.68800 -65.80183 44.65783 -65.86633
2   2   NA    NA       NA        NA 44.67033 -65.81833 44.67333 -65.84767 44.67033 -65.81833
3   3   NA    NA 44.19133 -63.32017 44.25583 -63.27117       NA        NA 44.19133 -63.32017
4   4   NA    NA 44.25717        NA 44.30950 -63.18617       NA        NA 44.30950 -63.18617
5   5   NA    NA 44.30667 -63.17550 44.35483 -63.08717       NA        NA 44.30667 -63.17550
6   6   NA    NA 44.35433 -63.07267 44.30633 -63.12117       NA        NA 44.35433 -63.07267

以上是关于同时填充2个数据框列?的主要内容,如果未能解决你的问题,请参考以下文章

Pandas 根据另一个数据框中的匹配列填充新的数据框列

在 Pandas 数据框列中填充缺失的日期值

根据其他列中描述的范围填充数据框列

使用 Python 填充所有 0 值的空白数据框列

将特定数据框列写入没有关联索引的字典值

计算数据框列中列表的所有排列