如何使用pandas.melt将宽格式差异对比DataFrame转为长格式?
解决FileMaker转Airtable时宽格式差异表转长格式问题
针对你对比CSV得到的宽格式差异表,用pandas做行拆分重组就能转成目标长格式,比melt更适配你的数据结构——你的宽表是每3列一组对应一条长表记录(唯一ID、字段名、字段值),具体操作如下:
代码实现
import pandas as pd # 读取宽格式文件:无表头,按空格分隔(如果是CSV就把delim_whitespace改成sep=',') df = pd.read_csv('diff_wide.csv', header=None, delim_whitespace=True) # 按每3列分组,对应(id, 字段名, 字段值)的结构 column_groups = [df.columns[i:i+3] for i in range(0, len(df.columns), 3)] # 遍历每组列,转成子表后合并 long_table_parts = [] for cols in column_groups: # 取当前组的列,重命名并过滤空行 sub_table = df[cols].dropna(how='all').rename(columns={cols[0]:'id', cols[1]:'field', cols[2]:'value'}) long_table_parts.append(sub_table) # 合并所有子表,清理空值后输出 final_long_table = pd.concat(long_table_parts, ignore_index=True).dropna() final_long_table.to_csv('diff_long.csv', sep=' ', index=False, header=False)
效果验证
输入宽表:
0 1 2 3 4 5 6 7 8 694 label lorem 675 biography henry 675 text lorem 708 text foo 708 label bar 708 description ipsum
运行后输出的长表:
694 label lorem 675 biography henry 675 text lorem 708 text foo 708 label bar 708 description ipsum
注意事项
- 如果原文件用逗号分隔,替换
delim_whitespace=True为sep=','即可适配CSV格式。 dropna()用来过滤宽表中未填满的空列产生的无效行,确保输出干净。
内容的提问来源于stack exchange,提问作者Paul Carlson
相关产品推荐
相关产品推荐

