我正在努力解决以下问题:给定一个包含列的数据框name,variable我想创建 2 个列表:list_names_nan 包含变量列中所有值为 nan 的名称list_names_not_nan 包含变量列中的列表 1 值不是 nan 的名称下面是一个例子import pandasimport numpydf = pandas.DataFrame(data=[['x',1],['y',2],['x',4],['z',numpy.nan], ['x',numpy.nan],['y',3],['x',numpy.nan],['z',numpy.nan],], columns=['name','variable'])df: name variable0 x 1.01 y 2.02 x 4.03 z NaN4 x NaN5 y 3.06 x NaN7 z NaN所需的输出应该是list_names_nan = [z]list_names_not_nan = [x,y]
2 回答
温温酱
TA贡献1752条经验 获得超4个赞
用于Series.isna
创建布尔掩码,然后Series.groupby
在此掩码上使用并聚合,all
最后使用此掩码m
过滤nan
和not_nan
值:
m = df['variable'].isna().groupby(df['name']).all()
nan, not_nan = m[m].index.tolist(), m[~m].index.tolist()
结果:
['z'] # nan
['x', 'y'] # not_nan
茅侃侃
TA贡献1842条经验 获得超21个赞
这是使用自定义聚合函数的另一种方法:
agg = df.groupby('name').agg(lambda x: all(np.isnan(x))).reset_index()
这会生成一个聚合数据框:
name variable
0 x False
1 y False
2 z True
False然后你就可以得到是或的名字True
list_names_nan = agg.loc[agg['variable']==True]['name'].tolist()
list_names_not_nan = agg.loc[agg['variable']==False]['name'].tolist()
添加回答
举报
0/150
提交
取消