如何在OpenRefine中实现行转列(Transpose Rows)操作?
解决OpenRefine中单列多行用户信息转置为多列的问题
嘿,我之前刚好处理过几乎一模一样的场景,结合你用的OpenRefine 2.6-rc.2版本,给你一步步拆解操作,保证能搞定:
第一步:给每组用户数据添加分组ID
你的数据是按「姓名→公司→地点」循环排列的,每组3行,所以先给同一用户的三行打上相同的分组标记:
- 点击原列(比如默认叫
column1)的下拉菜单,选择「Edit column」→「Add column based on this column」 - 列名填
group_id,输入公式:floor((row.index)/3)解释:
row.index是行的索引(从0开始),除以3取整后,每3行就会得到同一个ID,比如第0-2行是0,3-5行是1,刚好对应每个用户的一组数据
第二步:拆分每行的字段名和值
你的行内容是「字段名+内容」的格式(比如Company Name IBM),得把它们拆分开,方便后续转置:
- 新增
field_name列:- 同样用「Add column based on this column」,列名
field_name,公式:if(startsWith(value, "Company Name") || startsWith(value, "Location"), split(value, " ", 2)[0] + " " + split(value, " ", 2)[1], "Name")
解释:判断如果是公司或地点行,就拆分出前两个词作为字段名;如果是姓名行(没有前缀),就直接设字段名为
Name - 同样用「Add column based on this column」,列名
- 新增
field_value列:- 列名
field_value,公式:if(startsWith(value, "Company Name") || startsWith(value, "Location"), split(value, " ", 2)[2], value)
解释:公司/地点行取拆分后的第三部分及以后的内容(避免像
Lockheed-Martin这种带连字符的内容被拆碎),姓名行直接用原内容 - 列名
第三步:执行转置(Pivot)操作
现在就可以把多行转成多列了:
- 点击顶部菜单栏的「Rows」→「Pivot rows...」
- 在弹出的配置窗口里:
- Rows to pivot by:选择刚才的
field_name列(用它作为新表的列名) - Values in column:选择
field_value列(用它作为新表的单元格内容) - Pivot on:选择
group_id列(确保同一分组的行转成同一行的不同列)
- Rows to pivot by:选择刚才的
- 确认设置后点击「Pivot」,你就能得到每行对应一个用户,列是
Name、Company Name、Location的规整表格了
额外提示
如果你的数据里存在分组行数不固定的情况(比如有的用户缺字段),那生成group_id的公式要调整:可以用姓名行作为分组的起始标记,公式改成cumsum(not(startsWith(value, "Company Name")) && not(startsWith(value, "Location"))),这样每次遇到姓名行,分组ID就自动加1,适配不固定行数的分组。
内容的提问来源于stack exchange,提问作者Paul Ross
相关产品推荐
相关产品推荐

