【问题标题】:clean up the data frame by removing false rows in R or pandas清理数据框
【发布时间】:2022-10-13 17:08:07
【问题描述】:

我有一个看起来像这样的数据框。

有些行只是付款的回报:

Date        payment  Code       ID
-----------------------------------
24/06/2002  200      ABC        011    
24/06/2002  1000     M567       098       
01/07/2002  1000     M567       098       
01/07/2002  -1000    M567       098      
08/07/2002  1200     XYZ        999        
08/07/2002  -1200    XYZ        999      
15/07/2002  1200     XYZ        111   
17/07/2002  1200     XYZ        111     
22/07/2002  200      M300       011          
22/07/2002  56700    M678      12345   
28/07/2002  -56700   M678       NA
29/07/2002  -200     ABC        011     

我想通过考虑代码和 ID 来删除具有相同 +ve 和 -ve 付款的行。即,如果代码和 ID 列匹配并且付款正在取消,则删除这两列

因此,生成的数据框应该是这样的:

Date        payment  Code       ID     
01/07/2002  1000     M567       098           
15/07/2002  1200     XYZ        111  
17/07/2002  1200     XYZ        111      
22/07/2002  200      M300       011          
   

谁能帮我这个?

数据:

df1 <- structure(list(Date = c("24/06/2002", "24/06/2002", "01/07/2002", 
"01/07/2002", "08/07/2002", "08/07/2002", "15/07/2002", "17/07/2002", 
"22/07/2002", "22/07/2002","28/07/2002", "29/07/2002"), payment = c(200L, 
1000L, 1000L, -1000L, 1200L, -1200L, 1200L, 1200L, 200L, 56700L, -56700L
-200L), Code = c("ABC", "M567", "M567", "M567", "XYZ", "XYZ", 
"XYZ", "XYZ", "M300", "M678", "M678" , "ABC"), ID = c(11L, 98L, 98L, 98L, 
999L, 999L, 111L, 111L, 11L, 12345L, NA, 11L)), class = "data.frame", 
row.names = c(NA, 
-11L))

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    我们可以试试

    library(dplyr)
    library(data.table)
    df1 %>% 
      mutate(absPayment = abs(payment)) %>% 
      arrange(ID, Code, absPayment) %>%
      group_by(Code, ID, absPayment) %>%
      mutate(grp = rowid(sign(payment))) %>% 
      group_by(grp, .add = TRUE) %>%
      filter(n() == 1) %>%
      ungroup %>% 
      select(-grp, -absPayment)
    
    

    -输出

    # A tibble: 5 × 4
      Date       payment Code     ID
      <chr>        <int> <chr> <int>
    1 22/07/2002     200 M300     11
    2 01/07/2002    1000 M567     98
    3 15/07/2002    1200 XYZ     111
    4 17/07/2002    1200 XYZ     111
    5 22/07/2002   56700 M678  12345
    

    数据

    df1 <- structure(list(Date = c("24/06/2002", "24/06/2002", "01/07/2002", 
    "01/07/2002", "08/07/2002", "08/07/2002", "15/07/2002", "17/07/2002", 
    "22/07/2002", "22/07/2002", "29/07/2002"), payment = c(200L, 
    1000L, 1000L, -1000L, 1200L, -1200L, 1200L, 1200L, 200L, 56700L, 
    -200L), Code = c("ABC", "M567", "M567", "M567", "XYZ", "XYZ", 
    "XYZ", "XYZ", "M300", "M678", "ABC"), ID = c(11L, 98L, 98L, 98L, 
    999L, 999L, 111L, 111L, 11L, 12345L, 11L)), class = "data.frame", 
    row.names = c(NA, 
    -11L))
    

    【讨论】:

    • 谢谢@akrun。如果可能,请您添加 cmets
    • 不好意思再问。我刚刚意识到有些行的负行缺少 ID。您能告诉我如何在 group by 中实施“或声明”吗?
    • @bella_pa 不清楚评论。 ID 12345 没有任何负行。它会自动选择,因为成对(正面,负面)与grp 分组,因此将左侧作为不同的组。在filter 中,我们仅选择组大小为 1 的那些。您能否展示一个不适用于此代码的新示例
    • 非常感谢。 @akrun 我刚刚添加了一行额外的数据(见最后第二行)。因此,即使 ID 为 NA,它也必须检查 Code 并取消 +ve 和 -ve 符号。 (也更新了数据)
    猜你喜欢
    • 2012-08-23
    • 1970-01-01
    • 2021-09-04
    • 2019-05-13
    • 1970-01-01
    • 1970-01-01
    • 2018-03-20
    • 2021-03-05
    • 2020-01-04
    相关资源
    最近更新 更多