我有一个如下所示的数据框
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)我们是否总是必须提及我们要在value_vars
的pd.melt
部分下转换的所有列名称。我的真实数据将超过120列。所以我必须在这里提到所有这些吗?
您能帮我吗?
我们总是必须在pd.melt的value_vars部分下提及我们要转换的所有列名称。我的真实数据将超过120列。所以我必须在这里提到所有这些吗?
否,不是必须的,如果省略参数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