我正在尝试根据某些条件过滤熊猫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
答案 0 :(得分:1)
一个想法是将所有0
组与比较0
和GroupBy.transform
与GroupBy.all
进行过滤,并与|
进行按链OR
的{ {1}}行:
1
或者在可能的情况下,df = df[df['cus_group'].eq(0).groupby(df['cus_id']).transform('all') | df['cus_group'].eq(1)]
列中仅1
和0
值:
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