如何基于两个ID字段对含多组列的Pandas DataFrame进行逆透视
解决方案
你可以通过Pandas的两种常用方法实现这种逆透视转换,以下是具体实现:
方法一:使用pd.wide_to_long(推荐,适配有规律的列名)
这种方法专门针对你的列名格式(带有First/Second前缀,后跟ReasonName/ReasonValue),代码简洁高效:
步骤1:构造示例数据
import pandas as pd df = pd.DataFrame({ 'pid': [1, 2], 'fid': ["'x'", "'y'"], 'FirstReasonName': ["'a'", "'c'"], 'FirstReasonValue': [3, 8], 'SecondReasonName': ["'b'", "'d'"], 'SecondReasonValue': [8.2, 7] })
步骤2:执行逆透视
# 调用wide_to_long处理宽表 result = pd.wide_to_long( df, stubnames=['ReasonName', 'ReasonValue'], # 列名的公共后缀部分 i=['pid', 'fid'], # 作为标识的主键列 j='ReasonNum', # 生成的区分不同组的临时列 sep='', # 列名前缀和后缀之间无分隔符 suffix='.*' # 匹配前缀部分(First/Second) ).reset_index() # 重命名列并筛选需要的字段 result = result.rename(columns={'ReasonName': 'Reason', 'ReasonValue': 'Value'})[['pid', 'fid', 'Reason', 'Value']]
方法二:使用melt(通用型逆透视方法)
如果列名规律不明显,可通过分两次逆透视再合并的方式实现:
# 逆透视ReasonName列 reason_df = df.melt( id_vars=['pid', 'fid'], value_vars=['FirstReasonName', 'SecondReasonName'], value_name='Reason' ).drop(columns='variable') # 逆透视ReasonValue列 value_df = df.melt( id_vars=['pid', 'fid'], value_vars=['FirstReasonValue', 'SecondReasonValue'], value_name='Value' ).drop(columns='variable') # 合并两个结果 result = pd.concat([reason_df, value_df['Value']], axis=1)
最终结果
两种方法都会得到你需要的格式:
| pid | fid | Reason | Value |
|---|---|---|---|
| 1 | 'x' | 'a' | 3.0 |
| 1 | 'x' | 'b' | 8.2 |
| 2 | 'y' | 'c' | 8.0 |
| 2 | 'y' | 'd' | 7.0 |
内容的提问来源于stack exchange,提问作者ddd
相关产品推荐
相关产品推荐

