如何将DataFrame中y1-y4列合并为y列并标注来源列
合并DataFrame多列为单列并标注来源列
现有一个Pandas DataFrame,其中
y1至y4列的每一行仅有一个有效值,其余为NaN:x y1 y2 y3 y4 0 -17.7 -0.785430 NaN NaN NaN 1 -15.0 NaN NaN NaN -3820.085000 2 -12.5 NaN NaN 2.138833 NaN需要将所有y列合并为一列
y,同时新增一列no标注该值所属的原y列,期望输出:x y no 0 -17.7 -0.785430 y1 1 -15.0 -3820.085000 y4 2 -12.5 2.138833 y3
解决方案
方法一:使用stack()(推荐,适配每行仅一个有效值的场景)
stack()会自动过滤NaN值,直接将列索引转为行索引,操作高效:
import pandas as pd # 构造示例数据(实际使用时替换为你的DataFrame) df = pd.DataFrame({ 'x': [-17.7, -15.0, -12.5], 'y1': [-0.785430, pd.NA, pd.NA], 'y2': [pd.NA, pd.NA, pd.NA], 'y3': [pd.NA, pd.NA, 2.138833], 'y4': [pd.NA, -3820.085000, pd.NA] }) # 执行合并 result = df.set_index('x').stack().reset_index() # 重命名列 result.columns = ['x', 'no', 'y'] # 调整列顺序匹配期望输出 result = result[['x', 'y', 'no']] print(result)
方法二:使用melt() + dropna()
如果需要更灵活的列选择,可使用melt()将宽表转长表,再过滤空值:
import pandas as pd # 构造示例数据 df = pd.DataFrame({ 'x': [-17.7, -15.0, -12.5], 'y1': [-0.785430, pd.NA, pd.NA], 'y2': [pd.NA, pd.NA, pd.NA], 'y3': [pd.NA, pd.NA, 2.138833], 'y4': [pd.NA, -3820.085000, pd.NA] }) # 转长表并过滤空值 result = df.melt(id_vars='x', var_name='no', value_name='y').dropna(subset=['y']) # 重置索引并调整列顺序 result = result[['x', 'y', 'no']].reset_index(drop=True) print(result)
内容的提问来源于stack exchange,提问作者Peter M
相关产品推荐
相关产品推荐

