如何以Pythonic方式获取DataFrame中非0非缺失值的索引-列-值列表
问题
给定DataFrame df:
>>> df A B C r1 5 NaN 0 r2 0 6 0 r3 1 4 0
需要用不遍历DataFrame的Pythonic写法,得到目标列表from_to_value:
>>> from_to_value [['r1', 'A', 5], ['r2', 'B', 6], ['r3', 'A', 1], ['r3', 'B', 4]]
说白了就是筛选出值既不是NaN也不是0的条目,按「行索引、列名、对应值」的格式打包成嵌套列表。
解决方案
最简洁写法
直接用stack()配合链式操作一步到位:
from_to_value = df.stack()[lambda x: x != 0].reset_index().values.tolist()
分步拆解(方便理解)
如果觉得上面一行太紧凑,拆成步骤看更清楚:
# 1. stack把列转成二级索引,自动跳过NaN值,得到带双索引的Series stacked_series = df.stack() # 2. 过滤掉值为0的条目 filtered = stacked_series[stacked_series != 0] # 3. 把索引转成普通列,再转成嵌套列表 from_to_value = filtered.reset_index().values.tolist()
原理解释
stack():把DataFrame的列变成索引的一部分,返回的Series里,每条数据的索引是「原行名+原列名」,值是单元格内容,自动忽略NaN,这一步就帮我们干掉了所有NaN值;- 布尔筛选
stacked_series != 0:留下值不为0的条目; reset_index():把原来的双索引拆成两列,加上值列,变成一个三列的DataFrame;values.tolist():把这个三列DataFrame直接转成嵌套列表,正好符合要求的格式。
内容的提问来源于stack exchange,提问作者Newbielp
相关产品推荐
相关产品推荐

