首页 > 解决方案 > python pandas在组合列上融化

问题描述

我有一个这样的数据框。我有常规字段直到“状态”然后我将有拖车(3 列 tr1* 代表 1 个拖车)我想将这些拖车转换为行。我尝试了融化功能,但我只能使用 1 个拖车柱。请看下面的例子你可以理解

Name number city       state    tr1num   tr1acct   tr1ct  tr2num  tr2acct   tr2ct   tr3num   tr3acct  tr3ct 
DJ   10     Edison     nj       1001     20345     Dew    1002    20346     Newca.  1003.    20347.   pen 
ND   20     Newark     DE       2001     1985      flor   2002    1986      rodge

我期待这样的输出。

Name number city       state    trnum   tracct     trct
DJ   10     Edison     nj       1001     20345     Dew   
DJ   10     Edison     nj       1002     20346     Newca
DJ   10     Edison     nj       1003     20347     pen
ND   20     Newark     DE       2001     1985      flor
ND   20     Newark     DE       2002     1986      rodge

标签: pandasmelt

解决方案


您可以通过重命名列和位并应用 pandas wide_to_long 方法来实现此目的。下面是产生所需输出的代码。

df = pd.DataFrame({"Name":["DJ", "ND"], "number":[10,20], "city":["Edison", "Newark"], "state":["nj","DE"],
                  "trnum_1":[1001,2001], "tracct_1":[20345,1985], "trct_1":["Dew", "flor"], "trnum_2":[1002,2002],
                  "trct_2":["Newca", "rodge"], "trnum_3":[1003,None], "tracct_3":[20347,None], "trct_3":["pen", None]})

pd.wide_to_long(df, stubnames=['trnum', 'tracct', 'trct'], i='Name', j='dropme', sep='_').reset_index().drop('dropme', axis=1)\
  .sort_values('trnum')

输出

  Name state city number trnum  tracct  trct
0   DJ  nj  Edison  10  1001.0  20345.0 Dew
1   DJ  nj  Edison  10  1002.0  NaN     Newca
2   DJ  nj  Edison  10  1003.0  20347.0 pen
3   ND  DE  Newark  20  2001.0  1985.0  flor
4   ND  DE  Newark  20  2002.0  NaN    rodge
5   ND  DE  Newark  20  NaN     NaN   None

推荐阅读