连接数据帧中的行并基于i删除行

2024-04-25 09:15:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个这样的数据框:

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  

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

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

此表显示了对于串联ABCD,我们在A列的顶部表中有两个unique

下一步是在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  

在下一步中,我们需要将具有串联的行子集化。然后输出为:

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来实现这一点?请注意,我们在dataframe中有更多的行,需要一个迭代的解决方案来对dataframe进行子集设置。你知道吗

谢谢


Tags: 数据方法字符串dataframe步骤成员column解决方案
1条回答
网友
1楼 · 发布于 2024-04-25 09:15:06

一种方法是使用tidyverse,用唯一组的max替换所有的Column_C,确定哪些Column_B包含在Column_C(使用grepl)中,并用“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

我确信,如果我们将带有map*函数的rowwise()操作从purrr切换到rowwise()操作,这会更有效,但我目前还不能做到。你知道吗

相关问题 更多 >