Skip to main content
 首页 » 编程设计

python之pandas wide_long vs (stack and melt) 用于数据帧转换

2025年05月04日17lhb25

我有一个如下所示的数据框

df = pd.DataFrame({ 
'subject_ID':[1,2,3,4,5], 
'date_visit':['1/1/2020','3/3/2200','13/11/2100','24/05/2198','30/03/2071'], 
'a11fever':['Yes','No','Yes','Yes','No'], 
'a12diagage':[36,34,42,40,np.nan], 
'a12diagyr':[2021,3213,2091,4567,8901], 
'a12diagyrago':[6,np.nan,9,np.nan,np.nan]}) 

我想转换数据框,其中一个主题的示例输出如下所示

虽然我能够使用 pd.melt 和 stack 成功地做到这一点,但我无法使用 wide_long 做到这一点。

pd.melt(df, id_vars =['subject_ID','date_visit'], value_vars =['a11fever', 'a12diagage', 'a12diagyr','a12diagyrago'])  # works fine 
 
pd.wide_to_long(df, stubnames=['measurement', 'val'],i=(['subject_ID','date_visit']), j='grp').sort_index(level=0) # returns 0 records 
 
df.set_index(['subject_ID','date_visit']).stack().reset_index() #works fine 

我的另一个问题是,

a) 我们是否总是必须在 pd.melt 的 value_vars 部分下提及我们想要转换的所有列名。我的真实数据将有 120 多列。那么我必须在这里一一列举吗?

你能帮我看看如何使用 wide_long 吗?

请您参考如下方法:

Do we always have to mention all the column names that we would like to transform under value_vars section of pd.melt. My real data will have more than 120 columns. So do I have to mention all of them here?

不,没有必要,如果省略参数 value_vars 那么将使用所有列而不用于 id_vars:

df = pd.melt(df, id_vars =['subject_ID','date_visit']) 
print (df) 
 
    subject_ID  date_visit      variable value 
0            1    1/1/2020      a11fever   Yes 
1            2    3/3/2200      a11fever    No 
2            3  13/11/2100      a11fever   Yes 
3            4  24/05/2198      a11fever   Yes 
4            5  30/03/2071      a11fever    No 
5            1    1/1/2020    a12diagage    36 
6            2    3/3/2200    a12diagage    34 
7            3  13/11/2100    a12diagage    42 
8            4  24/05/2198    a12diagage    40 
9            5  30/03/2071    a12diagage   NaN 
10           1    1/1/2020     a12diagyr  2021 
11           2    3/3/2200     a12diagyr  3213 
12           3  13/11/2100     a12diagyr  2091 
13           4  24/05/2198     a12diagyr  4567 
14           5  30/03/2071     a12diagyr  8901 
15           1    1/1/2020  a12diagyrago     6 
16           2    3/3/2200  a12diagyrago   NaN 
17           3  13/11/2100  a12diagyrago     9 
18           4  24/05/2198  a12diagyrago   NaN 
19           5  30/03/2071  a12diagyrago   NaN