我有一个看起来像这样的数据框
import pandas as pd
import numpy as np
fff = pd.DataFrame({'group': ['a','a','a','b','b','b','b','c','c'], 'value': [1,2, np.nan, 1,2,3,4, np.nan, np.nan]})
仅当所有 group
是value
中的Nas时,我才希望将group
的NA删除。我该怎么办?
预期输出:
fff = pd.DataFrame({'group': ['a','a','a','b','b','b','b'], 'value': [1,2, np.nan, 1,2,3,4]})
答案 0 :(得分:4)
您可以检查value
中是否有nan
并使用groupby().any()
:
fff = fff[(~fff['value'].isna()).groupby(fff['group']).transform('any')]
输出:
group value
0 a 1.0
1 a 2.0
2 a NaN
3 b 1.0
4 b 2.0
5 b 3.0
6 b 4.0
答案 1 :(得分:3)
使用isna()
创建一个布尔序列,然后在fff['group']
上分组,并用transform
进行all
分组,然后过滤(排除)返回True
的值
c = fff['value'].isna()
fff[~c.groupby(fff['group']).transform('all')]
group value
0 a 1.0
1 a 2.0
2 a NaN
3 b 1.0
4 b 2.0
5 b 3.0
6 b 4.0
答案 2 :(得分:2)
另一个选择:
card.model2IV
输出:
fff["cases"] = fff.groupby("group").cumcount()
fff["null"] = fff["value"].isnull()
fff["cases 2"] = fff.groupby(["group","null"]).cumcount()
fff[~((fff["value"].isnull()) & (fff["cases"] == fff["cases 2"]))][["group","value"]]
答案 3 :(得分:1)
已经提供的答案的补充:仅保留所有值均为True的组,并使用fff
变量过滤result
数据帧。
result = fff.groupby("group").value.all().index.tolist()
fff.query("group == @result")