Pandas如何对指定列(London/New York/Boston)执行宽表转长表操作?
宽表转长格式的实现方案
你之前的代码出错是因为 pd.wide_to_long 要求待堆叠的列必须带有统一前缀,你当前的城市列(London、New York、Boston)无公共前缀,所以直接传["place"]无法匹配到对应列,无法得到正确结果。
推荐使用更适配当前场景的 pd.melt 实现,无需修改原列名:
import pandas as pd # 原始测试数据 df = pd.DataFrame({ 'date' : ['2021-08-01', '2021-08-01', '2021-08-01', '2021-08-02', '2021-08-02', '2021-08-02'], 'person': ['type_A', 'type_C', 'type_C', 'type_A', 'type_B', 'type_D'], 'London' : [1, 4, 7, 5, 7, 9], 'New York' : [2, 5, 8, 7, 9, 10], 'Boston' : [3, 6, 9, 1, 2, 7] }) # 核心转换代码 long_df = df.melt( id_vars=['date', 'person'], value_vars=['London', 'New York', 'Boston'], var_name='city', value_name='value' )
如果你坚持使用 pd.wide_to_long,需要先给城市列添加统一前缀再调用:
# 给城市列添加统一前缀 df = df.rename(columns={ 'London': 'place_London', 'New York': 'place_New York', 'Boston': 'place_Boston' }) df['id'] = df.index long_df = pd.wide_to_long( df, stubnames=['place'], i='id', j='city', sep='_', suffix='.+' ).reset_index(drop=True)
两种方法得到的最终长格式数据完全一致,优先选择melt方案代码更简洁。
内容的提问来源于stack exchange,提问作者codedancer
相关产品推荐
相关产品推荐

