从Pandas数据框中删除仅出现一次值的行

时间:2019-04-26 16:19:47

标签: python pandas

我有一个数据框,其中包含不同ID的每月记录,并且我只需要对具有多个记录月的ID进行一些分析。

ID    Month       Metric1    Metric2
1     2018-01-01  4          3      
1     2018-02-01  3          2
2     2018-02-01  1          5
3     2018-01-01  4          2
3     2018-02-01  6          3
4     2018-01-01  3          1

我将如何过滤出仅出现一次的ID行,并将其保留为多行并得到类似的结果

ID    Month       Metric1    Metric2
1     2018-01-01  4          3      
1     2018-02-01  3          2
3     2018-01-01  4          2
3     2018-02-01  6          3

我看过其他一些提到的页面,例如:

df = df[df.groupby('ID').ID.transform(len) > 1]

但是我不想通过分组丢失每个月的指标。

3 个答案:

答案 0 :(得分:4)

len更改为count

df[df.groupby('ID').ID.transform('count') > 1]
Out[589]: 
   ID       Month  Metric1  Metric2
0   1  2018-01-01        4        3
1   1  2018-02-01        3        2
3   3  2018-01-01        4        2
4   3  2018-02-01        6        3

答案 1 :(得分:3)

尝试使用pd.series.duplicated()

df1=df[df.ID.duplicated(keep=False)]
print(df1)

   ID       Month  Metric1  Metric2
0   1  2018-01-01        4        3
1   1  2018-02-01        3        2
3   3  2018-01-01        4        2
4   3  2018-02-01        6        3

答案 2 :(得分:3)

filter

我不能保证这个的速度,但是这就是该API的目的...

df.groupby('ID').filter(lambda d: len(d) > 1)

   ID       Month  Metric1  Metric2
0   1  2018-01-01        4        3
1   1  2018-02-01        3        2
3   3  2018-01-01        4        2
4   3  2018-02-01        6        3

@ Wen-Ben答案的数字版

u, i = np.unique(df.ID.values, return_inverse=True)

df[np.bincount(i)[i] > 1]

   ID       Month  Metric1  Metric2
0   1  2018-01-01        4        3
1   1  2018-02-01        3        2
3   3  2018-01-01        4        2
4   3  2018-02-01        6        3

因为我很好奇...

s0 = set()
s1 = set()

for i in df.ID:
    if i in s0:
        s1.add(i)
    s0.add(i)

df[df.ID.map(s1.__contains__)]

   ID       Month  Metric1  Metric2
0   1  2018-01-01        4        3
1   1  2018-02-01        3        2
3   3  2018-01-01        4        2
4   3  2018-02-01        6        3