You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:将多行多列Pandas DataFrame转换为单行多列时出错

问题解决:将Pandas DataFrame从3行2列转为1行6列

先重现你的原始DataFrame:

import pandas as pd

df = pd.DataFrame({
    'time': ['2020-01-01', '2020-01-02', '2020-01-03'],
    'val1': [1, 2, 3],
    'val2': [4, 5, 6]
})

你用pivot报错的原因是:pivot需要明确指定index、columns、values三个核心参数,且这些参数得是单一列名/标量,不适合直接把所有数值平铺成一行的场景。如果错误传入多列或数组,就会触发「数组真值不明确」的报错。

下面是几种可行的解决方案:

方法1:直接提取值重塑(最简洁)

直接提取数值列的所有值,平铺成一维数组后重新构造DataFrame:

# 提取val1、val2的所有值并按顺序平铺
flat_values = df[['val1', 'val2']].values.flatten()
# 生成目标DataFrame,自定义列名
new_df = pd.DataFrame([flat_values], columns=[f'val{i+1}' for i in range(len(flat_values))])

执行后得到的结果完全符合需求:

val1  val2  val3  val4  val5  val6
0     1     2     3     4     5     6

方法2:melt + unstack(适合复杂扩展场景)

如果后续有更多列需要处理,可先转窄表再重新展开:

# 将val1、val2转为行记录
melted = df.melt(id_vars='time', value_vars=['val1', 'val2'], value_name='value')
# 按列名、时间排序,保证val1的三个值在前,val2的在后
melted = melted.sort_values(['variable', 'time'])
# 将值转为一行并命名列
new_df = pd.DataFrame([melted['value'].values], columns=[f'val{i+1}' for i in range(len(melted))])

方法3:stack + 转置

通过堆叠列生成Series,再转置为行:

# 堆叠val1、val2列,得到包含所有值的Series
stacked = df[['val1', 'val2']].stack()
# 转置为行结构并重置列名
new_df = stacked.reset_index(drop=True).to_frame().T
new_df.columns = [f'val{i+1}' for i in range(new_df.shape[1])]

内容的提问来源于stack exchange,提问作者Sadcow

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 06:30:53