Python 如何仅在pandas中groupby中的所有元素都是NAs时删除NAs
我有一个像这样的数据框Python 如何仅在pandas中groupby中的所有元素都是NAs时删除NAs,python,python-3.x,pandas,Python,Python 3.x,Pandas,我有一个像这样的数据框 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]}) 仅当所有值都是组内的NAs时,我才想按组删除NAs。我怎么能这么做 预期产出: fff = pd.DataFrame({'group': ['a','a','
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]})
仅当所有值都是组内的NAs时,我才想按组删除NAs。我怎么能这么做
预期产出:
fff = pd.DataFrame({'group': ['a','a','a','b','b','b','b'], 'value': [1,2, np.nan, 1,2,3,4]})
用isna()
创建一个布尔序列,然后在fff['group']
上分组,用all
进行transform
,然后过滤(排除)返回True
c = fff['value'].isna()
fff[~c.groupby(fff['group']).transform('all')]
您可以检查value
中的nan
并使用groupby()。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
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
另一种选择:
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"]]
输出:
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
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
对已提供答案的补充:仅保留所有值均为真的组,并使用结果变量过滤fff
数据帧
result = fff.groupby("group").value.all().index.tolist()
fff.query("group == @result")