【问题标题】:Concatenate rows in a dataframe and delete rows based on it连接数据框中的行并根据它删除行
【发布时间】:2017-07-25 06:23:09
【问题描述】:

我有一个这样的数据框:

Column_A | Column_B | Column_C  
---------|----------|---------  
1        |  A       | ABCD  
1        | B        | ABCD  
1        | C        | ABCD  
1        | D        | ABCD  
2        | B        | BCDX  
2        | C        | BCDX  
2        | D        | BCDX  
2        | X        | BCDX  
3        | A        | ABCD  
3        | B        | ABCD  
3        | C        | ABCD  
3        | D        | ABCD  

然后我想找出 column_C 上分组的唯一性。此步骤的输出如下所示:

Column_A | Column_B  
-------- | --------  
ABCD     | 2  
BCDX     | 1  

此表展示了对于串联 ABCD,我们在 A 列中为顶层表提供了两个唯一性

下一步是在 D 列中为 ABCD 的所有子字符串成员分配 ABCD

Column_A | Column_B | Column_C  
---------|----------|---------  
1        | A        | ABCD  
1        | B        | ABCD  
1        | C        | ABCD  
1        | D        | ABCD  
2        | B        | ABCD  
2        | C        | ABCD  
2        | D        | ABCD  
2        | X        |     
3        | A        | ABCD  
3        | B        | ABCD  
3        | C        | ABCD  
3        | D        | ABCD  

在下一步中,我们需要对具有连接 ABCD 的行进行子集化。输出将是:

Column_A | Column_B  
---------|----------  
2        |  X  

然后和之前一样,我们只需在 C 列中分配 X,最终输出如下所示:

Column_A | Column_B | Column_C  
---------|----------|-----------  
1        | A        | ABCD  
1        | B        | ABCD  
1        | C        | ABCD  
1        | D        | ABCD  
2        | B        | ABCD  
2        | C        | ABCD  
2        | D        | ABCD  
2        | X        | X      
3        | A        | ABCD  
3        | B        | ABCD  
3        | C        | ABCD  
3        | D        | ABCD

上表应该是我们的最终输出。有没有一种优雅的方式可以使用 r/python 执行此操作?请注意,我们在数据框中有更多行,需要一个迭代解决方案来对数据框进行子集化。

谢谢

【问题讨论】:

  • 我是 R/Python 的新手,不知道如何继续。

标签: python r subset delete-row


【解决方案1】:

一种方法是使用tidyverse,将所有Column_C 替换为唯一组的max,确定Column_C 中包含哪些Column_B(使用grepl)并替换不包含的Column_B t 与 'X',即

library(tidyverse)

df %>% 
 group_by(Column_C) %>% 
 mutate(new = n_distinct(Column_A)) %>% 
 ungroup() %>% 
 mutate(Column_C = Column_C[max(new)]) %>% 
 rowwise() %>% 
 mutate(Column_C = replace(Column_C, !grepl(Column_B, Column_C), 'X')) %>% 
 select(-new)

Source: local data frame [12 x 3]
Groups: <by row>

# A tibble: 12 x 3
#   Column_A Column_B Column_C
#      <int>    <chr>    <chr>
# 1        1        A     ABCD
# 2        1        B     ABCD
# 3        1        C     ABCD
# 4        1        D     ABCD
# 5        2        B     ABCD
# 6        2        C     ABCD
# 7        2        D     ABCD
# 8        2        X        X
# 9        3        A     ABCD
#10        3        B     ABCD
#11        3        C     ABCD
#12        3        D     ABCD

我确信如果我们将 rowwise() 操作与 map* 函数从 purrr 切换,这会更有效,但我目前无法做到这一点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-15
    • 1970-01-01
    • 1970-01-01
    • 2022-10-14
    • 1970-01-01
    • 2018-06-04
    • 2021-01-22
    • 1970-01-01
    相关资源
    最近更新 更多