【问题标题】:Concatenate rows in a dataframe [duplicate]连接数据框中的行[重复]
【发布时间】:2017-12-30 19:48:54
【问题描述】:

我有一个如下结构的数据框:

Column A  Column B

1          A  
1          B  
1          C  
1          D  
2          B  
2          C  
2          D  
2          E 

我想连接属于 A 列中特定值的所有行。

我希望最终输出看起来像这样:

Column A Column B Column C  
1        A        ABCD    
1        B        ABCD  
1        C        ABCD  
1        D        ABCD  
2        B        BCDE  
2        C        BCDE  
2        D        BCDE  
2        E        BCDE   

我将如何在 R/Python 中执行此操作?

谢谢

【问题讨论】:

  • with(df, ave(ColumnB, ColumnA, FUN = function(i) paste(i, collapse = ''))) in base R
  • @Sotos 你确定你的解决方案吗?
  • @Tushar 很确定。为什么?你看到我错过了什么吗?
  • @Sotos 让我检查一下,我可能错过了什么。收到奇怪的警告信息。 [1] <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> Levels: a b c d e Warning messages: 1: In [(*tmp*, i, value = "abcd") : invalid factor level, NA generated 2: In [(*tmp*, i, value = "bcde") : invalid factor level, NA generated
  • @Sotos 知道了。在创建data.frame ColumnB 时被视为一个因素,因此我得到了错误。道歉。

标签: python r concatenation


【解决方案1】:

R 中,我们可以使用dplyr。按'ColumnA'分组后,paste'ColumnB'的内容并用mutate创建一个新列

library(dplyr)
df1 %>%
     group_by(ColumnA) %>% 
     mutate(ColumnC = paste(ColumnB, collapse=""))
# A tibble: 8 x 3
# Groups:   ColumnA [2]
#  ColumnA ColumnB ColumnC
#    <int>   <chr>   <chr>
#1       1       A    ABCD
#2       1       B    ABCD
#3       1       C    ABCD
#4       1       D    ABCD
#5       2       B    BCDE
#6       2       C    BCDE
#7       2       D    BCDE
#8       2       E    BCDE

或者另一个选项是data.table

library(data.table)
setDT(df1)[,  ColumnC := paste(ColumnB, collapse=""), by = ColumnA]

数据

df1 <- structure(list(ColumnA = c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L), ColumnB = c("A", 
 "B", "C", "D", "B", "C", "D", "E")), .Names = c("ColumnA", "ColumnB"
 ), class = "data.frame", row.names = c(NA, -8L))

如果我们需要python,那么

>>> import pandas as pd;
>>> df1 = pd.read_clipboard()
>>> df1
#   ColumnA ColumnB
#1        1       A
#2        1       B
#3        1       C
#4        1       D
#5        2       B
#6        2       C
#7        2       D
#8        2       E
>>> df1['ColumnC'] = df1.groupby('ColumnA')['ColumnB'].transform(lambda x: ''.join(x))
>>> df1
#   ColumnA ColumnB ColumnC
#1        1       A    ABCD
#2        1       B    ABCD
#3        1       C    ABCD
#4        1       D    ABCD
#5        2       B    BCDE
#6        2       C    BCDE
#7        2       D    BCDE
#8        2       E    BCDE

【讨论】:

    【解决方案2】:

    @Sotos 在评论中建议的基础R 中的单线。对于此解决方案,请确保 df 中的 ColumnBcharacter 而不是 factor

    with(df, ave(ColumnB, ColumnA, FUN = function(i) paste(i, collapse = '')))
    

    另一个基地R解决方案:

    df$ColumnC<-rep(unlist(by(df,INDICES = df$ColumnA,
    function(t){paste(t$ColumnB,collapse = "")},simplify = F)),each=4)
    
    >df
    #ColumnA ColumnB ColumnC
    #1       1       a    abcd
    #2       1       b    abcd
    #3       1       c    abcd
    #4       1       d    abcd
    #5       2       b    bcde
    #6       2       c    bcde
    #7       2       d    bcde
    #8       2       e    bcde
    

    【讨论】:

    • 如果你喜欢,你也可以在你的解决方案中添加我的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-24
    • 2021-09-02
    • 2020-05-29
    • 2018-02-01
    • 1970-01-01
    相关资源
    最近更新 更多