Python 在R中,仅保留出现至少3年的值,每年至少10次

Python 在R中,仅保留出现至少3年的值,每年至少10次,python,r,conditional,Python,R,Conditional,请参阅下面我的数据集的一般示例。我只想保留ID中的计数数据,这些数据至少出现3年,每年至少出现10次。所以,这里,我只需要ID为“a”的数据,我想删除ID为“b”和“c”的数据 我对r、python和excel有一些基本/一般的知识。使用这三种语言中的任何一种都可以做到这一点。我想我更喜欢r。多谢各位 ID year count a 2001 2 b 2001 3 a 2001 2 a 2001 1 a 2001 4 a 2001

请参阅下面我的数据集的一般示例。我只想保留ID中的计数数据,这些数据至少出现3年,每年至少出现10次。所以,这里,我只需要ID为“a”的数据,我想删除ID为“b”和“c”的数据

我对r、python和excel有一些基本/一般的知识。使用这三种语言中的任何一种都可以做到这一点。我想我更喜欢r。多谢各位

ID  year    count
a   2001    2
b   2001    3
a   2001    2
a   2001    1
a   2001    4 
a   2001    0
a   2001    1
a   2001    3
a   2001    2
b   2001    3
b   2001    4
a   2001    5
b   2001    2
c   2001    3
a   2001    5
a   2001    1
c   2001    1
c   2002    2
a   2002    1
b   2002    2
c   2002    3
a   2002    2
a   2002    1
a   2002    3
a   2002    4
a   2002    3
a   2002    2
b   2002    4
b   2002    2
a   2002    1
b   2002    1
c   2002    2
a   2002    3
a   2002    4
a   2002    5
c   2002    2
a   2003    2
a   2003    1
a   2003    2
a   2003    4
c   2003    3
a   2003    2
a   2003    1
b   2003    3
a   2003    5
a   2003    3
a   2003    2
a   2003    1
a   2003    3
a   2003    2
c   2003    2
b   2003    2
b   2003    1
b   2003    4
c   2003    3
在R中,你可以使用

GoodIDs = names(which(rowSums(table(df$ID, df$year) >= 10) >=3))
df[df$ID %in% GoodIDs,]
血淋淋的细节

只需列出每年id组合发生的次数就可以帮上大忙

table(df$ID, df$year)
    2001 2002 2003
  a   11   11   12
  b    4    4    4
  c    2    4    3
现在我们看到了答案(只需要id=a),但我们希望通过它来获得完整的答案。下一步,测试表中的哪些条目至少为10

table(df$ID, df$year) >= 10
     2001  2002  2003
  a  TRUE  TRUE  TRUE
  b FALSE FALSE FALSE
  c FALSE FALSE FALSE
现在我们要计算每个id有多少年为true。使用true将被视为1,FALSE将被视为0这一事实,我们可以跨行添加

rowSums(table(df$ID, df$year) >= 10)
a b c 
3 0 0 
现在我们要测试其中哪一个至少是3

which(rowSums(table(df$ID, df$year) >= 10) >=3)
a 
1
现在获取所选的ID

names(which(rowSums(table(df$ID, df$year) >= 10) >=3))
[1] "a"
我们将其存储在GoodID中,然后提取具有所选ID的所有行

df[df$ID %in% GoodIDs,]
<output omitted>
df[df$ID%在%goodid中,]

Python解决方案:

import pandas as pd
将CSV文件读入数据帧:

df = pd.read_table('foo.csv', sep='\s+')
按ID和年份分组,仅选择总计数至少为10的年份和ID:

df1 = df.groupby(['ID','year']).sum()
df2 = df1[df1 >= 10].dropna()
消除所有少于3年的变量:

df3 = df2.reset_index().groupby('ID').count()['count']
df3[df3 >= 3].index.values
结果:

#array(['a'], dtype=object)

已经提出了使用和的解决方案。为了完整性起见,我建议使用
data.table
包的R解决方案,该包以快速聚合大数据、快速有序联接等著称

OP希望保留ID的计数数据,这些数据至少出现3年,每年至少出现10次

因此,有必要确定应保留其数据的ID,并相应地过滤数据集。为了确定符合要求的ID,首先测试每个ID满足10个条件的年份,然后计算每个ID的年数是很重要的

使用
数据。表
可以在一行中组合:

library(data.table)
setDT(DF)[DF[, .N, .(ID, year)][N >= 10L, .N, ID][N >= 3L, .(ID)], on = "ID"]
解释
  • setDT(DF)将data.frame强制为class
    data.table
  • DF[,.N,.(ID,year)]
    统计按ID和year分组的外观数量
  • 下一个操作
    [N>=10L,.N,ID]
    是链接的,即它将上一步的结果作为输入。它计算满足10个条件的每个ID的年数
  • [N>=3L,.(ID)]
    检查3年条件并返回一个
    数据。表
    仅包含一列所选ID
  • 完整数据集的最终筛选操作作为与所选ID的右连接实现。它只返回ID与所选ID之一匹配的完整数据集的行。在连接操作
    setDT(DF)[DF[…],on=“ID”]
    中,参数告诉
    on=“ID”
    要在哪个列中查找匹配项
  • 数据 我在2003年为ID“b”添加了更多的数据行,以涵盖一个ID满足10个条件但仅一年的情况

    DF <- structure(list(ID = c("a", "b", "a", "a", "a", "a", "a", "a", 
    "a", "b", "b", "a", "b", "c", "a", "a", "c", "c", "a", "b", "c", 
    "a", "a", "a", "a", "a", "a", "b", "b", "a", "b", "c", "a", "a", 
    "a", "c", "a", "a", "a", "a", "c", "a", "a", "b", "a", "a", "a", 
    "a", "a", "a", "c", "b", "b", "b", "b", "b", "b", "b", "b", "b", 
    "c"), year = c(2001L, 2001L, 2001L, 2001L, 2001L, 2001L, 2001L, 
    2001L, 2001L, 2001L, 2001L, 2001L, 2001L, 2001L, 2001L, 2001L, 
    2001L, 2002L, 2002L, 2002L, 2002L, 2002L, 2002L, 2002L, 2002L, 
    2002L, 2002L, 2002L, 2002L, 2002L, 2002L, 2002L, 2002L, 2002L, 
    2002L, 2002L, 2003L, 2003L, 2003L, 2003L, 2003L, 2003L, 2003L, 
    2003L, 2003L, 2003L, 2003L, 2003L, 2003L, 2003L, 2003L, 2003L, 
    2003L, 2003L, 2003L, 2003L, 2003L, 2003L, 2003L, 2003L, 2003L
    ), count = c(2L, 3L, 2L, 1L, 4L, 0L, 1L, 3L, 2L, 3L, 4L, 5L, 
    2L, 3L, 5L, 1L, 1L, 2L, 1L, 2L, 3L, 2L, 1L, 3L, 4L, 3L, 2L, 4L, 
    2L, 1L, 1L, 2L, 3L, 4L, 5L, 2L, 2L, 1L, 2L, 4L, 3L, 2L, 1L, 3L, 
    5L, 3L, 2L, 1L, 3L, 2L, 2L, 2L, 1L, 4L, 2L, 1L, 4L, 2L, 1L, 4L, 
    3L)), .Names = c("ID", "year", "count"), row.names = c(NA, -61L
    ), class = "data.frame", index = structure(integer(0), "`__ID`" = c(1L, 
    3L, 4L, 5L, 6L, 7L, 8L, 9L, 12L, 15L, 16L, 19L, 22L, 23L, 24L, 
    25L, 26L, 27L, 30L, 33L, 34L, 35L, 37L, 38L, 39L, 40L, 42L, 43L, 
    45L, 46L, 47L, 48L, 49L, 50L, 2L, 10L, 11L, 13L, 20L, 28L, 29L, 
    31L, 44L, 52L, 53L, 54L, 55L, 56L, 57L, 58L, 59L, 60L, 14L, 17L, 
    18L, 21L, 32L, 36L, 41L, 51L, 61L)))
    

    DF那么到目前为止你有什么?嘿@hminutu让我们看看你已经完成了什么。是否正确
    count
    与决定无关?仅仅一个身份证在三年中每年至少出现10次?老实说,我还没有什么。我想应该有if语句之类的。3年条件的第一个if语句,然后是10年条件库(dplyr)的另一个if语句;df%>%group\u by(ID)%%>%filter(n\u distinct(year)>=3)%%>%group\u by(ID,year)%%>%filter(n()>=10)
    这看起来不错。。。!你能解释一下它是怎么工作的吗。。?或者其他人可以吗?它似乎起作用了,但我真的很想知道它是如何起作用的。非常感谢。好的,我正在努力解决这个问题,我想我看到了它的工作原理。我在我原来的帖子里忘了一个关键词。。。我希望是连续三年。这能做到吗。。?看起来不是,但我可能错了。有什么我可以补充,使它连续?这不需要几年连续。这看起来很好,我真的很感谢你的努力,以彻底解释这一点。。。。但是,到底什么是大熊猫?谢谢。熊猫是一个处理数据集的图书馆。它在数据处理中被大量使用