今回のように、groupby()
の結果を使って元のDataFrameをFilteringしたい場合は、groupby().apply()
ではなく groupby().transform()
を使うと良いかとおもいます。
タイトルのフィルタリングの条件を
correction列が全てTrue(df['correction'].all())
もしくは 全てFalse (not df['correction'].any())
の列を削除する
と読み替えて実装すると
Python
1rc[rc.groupby('id')['correction'].transform(lambda d: (d.any()) & (not d.all()))]
で実現できるかと思います。
次に pandasを使わない方法ですが、key を id
、valueを correction
のリスト とした dict型のデータを作成した後に、上記の条件でフィルタリングするとよいかと思います。
ということで、以下に動作サンプルを書きましたので参考にしてください。
Python
1import pandas as pd
2import io
3
4data = """
5,id,correction
60,c6dfa9de-e357-4d1d-834d-15b3d6bbd8ea,False
71,c6dfa9de-e357-4d1d-834d-15b3d6bbd8ea,False
82,c6dfa9de-e357-4d1d-834d-15b3d6bbd8ea,False
93,c6dfa9de-e357-4d1d-834d-15b3d6bbd8ea,False
104,c6dfa9de-e357-4d1d-834d-15b3d6bbd8ea,False
115,a8dfa9de-e357-4d1d-834d-15b3d6bbd8ea,True
126,a8dfa9de-e357-4d1d-834d-15b3d6bbd8ea,False
137,a8dfa9de-e357-4d1d-834d-15b3d6bbd8ea,True
148,c9dfa9de-e357-4d1d-834d-15b3d6bbd8ea,True
159,c9dfa9de-e357-4d1d-834d-15b3d6bbd8ea,True
16"""
17
18### PANDAS を使った例 ###
19rc = pd.read_csv(io.StringIO(data), index_col=0)
20ret = rc[rc.groupby('id')['correction'].transform(lambda d: (d.any()) & (not d.all()))]
21print(ret)
22# id correction
23#5 a8dfa9de-e357-4d1d-834d-15b3d6bbd8ea True
24#6 a8dfa9de-e357-4d1d-834d-15b3d6bbd8ea False
25#7 a8dfa9de-e357-4d1d-834d-15b3d6bbd8ea True
26
27
28### LIST を使った例 ###
29# データをList型に変換する
30arrays = rc.reset_index().values.tolist()
31# 重複を省いたUniqueなIDを求める
32ids = {row[1] for row in arrays}
33# データをidをkeyとしたdict型に変換
34dict_data = {id:[] for id in ids}
35for row in arrays:
36 dict_data[row[1]].append(row[2])
37# {'c6dfa9de-e357-4d1d-834d-15b3d6bbd8ea': [False, False, False, False, False], 'a8dfa9de-e357-4d1d-834d-15b3d6bbd8ea': [True, False, True], 'c9dfa9de-e357-4d1d-834d-15b3d6bbd8ea': [True, True]}
38# 条件に適合したIDを導く
39target_id = [id for id, d in dict_data.items() if (any(d)) and (not all(d))]
40# 結果表示
41for idx, id, correction in arrays:
42 if id in target_id:
43 print(idx, id, correction)
44#5 a8dfa9de-e357-4d1d-834d-15b3d6bbd8ea True
45#6 a8dfa9de-e357-4d1d-834d-15b3d6bbd8ea False
46#7 a8dfa9de-e357-4d1d-834d-15b3d6bbd8ea True