我有以下数据框
channel_id user_agent_id user_id_x percents_normalized user_id_y
0 1 1 1 NaN NaN
1 1 2 1 0.734928 1.0
2 1 3 1 0.369057 1.0
3 2 1 2 NaN NaN
4 3 1 3 NaN NaN
5 3 5 3 NaN NaN
6 3 10 3 NaN NaN
7 4 2 4 0.734928 1.0
8 5 2 5 0.734928 1.0
我希望能够按channel_id进行分组,并且对于每个组,移除大小大于1的每个组的NaN记录,并在percents_normalized
列上删除至少一个用于channel_id' s的非NaN值我想从channel_id 1中删除Nan。频道3的大小> 1但是所有行都有NaN,而通道ID 2的大小为1。
答案 0 :(得分:1)
您可以使用groupby.transform
构建布尔序列以进行子集化;条件((x.size==1) or x.isnull().all()) | x.notnull()
由组级别条件(x.size==1) or x.isnull().all()
组成,如果true
只有一条记录或所有记录都为空,则为id
,并且记录级别条件为x.notnull()
{1}},即如果不满足组级别条件,则仅保留非空值:
(df[df.groupby('channel_id').percents_normalized
.transform(lambda x: ((x.size==1) or x.isnull().all()) | x.notnull()).astype(bool)])