如何无需嵌套循环同时遍历DataFrame行列,提取含数值单元格的索引与列名?
无需嵌套循环的简便解法
当然有啦!用pandas内置的stack()方法就能完美解决这个需求,全程不需要手动写嵌套循环,代码简洁还高效。
步骤详解:
- 先构造示例DataFrame(和你给出的结构一致):
import pandas as pd import numpy as np df = pd.DataFrame( {'A': [np.nan, np.nan, np.nan], 'B': [np.nan, 4, np.nan], 'C': [np.nan, np.nan, 5]}, index=['04/04/18', '05/04/19', '06/04/20'] )
- 用
stack()提取非NaN单元格:stack()方法会自动剔除所有包含NaN的单元格,把剩余有效数据整理成一个Series,它的索引是原行索引+列名的多层元组:
stacked_series = df.stack()
此时stacked_series的输出为:
05/04/19 B 4.0 06/04/20 C 5.0 dtype: float64
- 处理索引生成目标字符串列表:
我们只需要把多层索引的元组反转(列名在前,行索引在后),用'-'拼接成字符串,再转成列表即可。这里用index.map()做向量式操作,比列表推导更高效:
result = stacked_series.index.map(lambda idx_tuple: f"{idx_tuple[1]}-{idx_tuple[0]}").tolist()
最终result就是你想要的:["B-05/04/19","C-06/04/20"]
一行代码简化版:
如果想更紧凑,还可以把步骤合并成一行:
result = df.stack().index.map(lambda x: f"{x[1]}-{x[0]}").tolist()
这个方法完全利用了pandas的向量化操作,避免了手动循环,处理大DataFrame时效率优势会更明显~
内容的提问来源于stack exchange,提问作者JamesHudson81
相关产品推荐
相关产品推荐

