过滤熊猫DataFrame的重复行

时间:2019-10-02 08:52:35

标签: python pandas dataframe

我正在尝试根据某些条件过滤熊猫DataFrame的行,但遇到了困难。 DataFrame就像这样:

import pandas as pd
import numpy as np

df = pd.DataFrame({'cus_id': [1111, 2222, 2222, 3333, 4444, 4444, 4444, 5555, 5555], 
                  'cus_group' : [1, 1, 0, 0, 1, 1, 0, 0, 0]})

print(df)

   cus_id  cus_group
0    1111          1
1    2222          1
2    2222          0
3    3333          0
4    4444          1
5    4444          1
6    4444          0
7    5555          0
8    5555          0

我要应用的选择如下:

对于出现多次的所有 cus_id (即,对于所有重复的 cus_id ),请仅保留 cus_group 等于1的副本。 。警告:如果 cus_id 出现多次但仅属于组0,则我们保留该客户的所有实例。

从视觉上看,我想要的结果DataFrame是这样的:

   cus_id  cus_group
0    1111          1
1    2222          1
2    3333          0
3    4444          1
4    4444          1
5    5555          0
6    5555          0

对于 cus_id = 5555可以看到,即使它确实出现过两次,我们仍保留了这两个记录,因为它仅属于第0组。我已经使用了plicated()方法尝试了一些事情但没有成功。任何其他帮助,将不胜感激。


编辑 jezrael 提供的解决方案非常适合上述示例。我注意到在我使用的真实DataFrame中,有些情况下客户链接到NaN组。例如:

import pandas as pd
import numpy as np

df = pd.DataFrame({'cus_id': [1111, 2222, 2222, 3333, 4444, 4444, 4444, 5555, 5555, 6666, 7777, 7777, ], 
                  'cus_group' : [1, 1, 0, 0, 1, 1, 0, 0, 0, np.nan, np.nan, np.nan]})

print(df)

    cus_id  cus_group
0     1111        1.0
1     2222        1.0
2     2222        0.0
3     3333        0.0
4     4444        1.0
5     4444        1.0
6     4444        0.0
7     5555        0.0
8     5555        0.0
9     6666        NaN
10    7777        NaN
11    7777        NaN

使用 jezrael 的解决方案,这些客户被删除。是否有一种快速解决方案,可以将 ALL (包括重复项)保留在最终DataFrame中?视觉上(过滤后):

    cus_id  cus_group
0     1111        1.0
1     2222        1.0
2     3333        0.0
3     4444        1.0
4     4444        1.0
5     5555        0.0
6     5555        0.0
7     6666        NaN
8     7777        NaN
9     7777        NaN

2 个答案:

答案 0 :(得分:1)

一个想法是将所有0组与比较0GroupBy.transformGroupBy.all进行过滤,并与|进行按链OR的{ {1}}行:

1

或者在可能的情况下,df = df[df['cus_group'].eq(0).groupby(df['cus_id']).transform('all') | df['cus_group'].eq(1)] 列中仅10值:

cus_group

df = df[df.groupby('cus_id')['cus_group'].transform('nunique').eq(1) | df['cus_group'].eq(1)]

答案 1 :(得分:1)

快速解决方案将被过滤的NaN组,然后追加到表中:

df = df[df.groupby('cus_id')['cus_group'].transform('nunique').eq(1)
     | df['cus_group'].eq(1)].append(df[df['cus_group'].isnull()])
   print(df)

答案:

    cus_id  cus_group
0     1111        1.0
1     2222        1.0
3     3333        0.0
4     4444        1.0
5     4444        1.0
7     5555        0.0
8     5555        0.0
9     6666        NaN
10    7777        NaN
11    7777        NaN
相关问题