2017-10-13 69 views
2

我有一个如下面的DataFrame。我试图用pivot转置它,但结果并不如我所愿。我要完成以下 - 我希望它转换为在pandas/python中调换DataFrame,但不是所有列

df=pd.DataFrame({'ID_Patient':[11132,2755,9753,8453,4872],'Name_Patient':['Jim','Jack','Sue','Tom','James'],'Visits_Jan':[2,1,0,4,2],'Visits_Feb':[5,0,0,1,1],'Visits_Mar':[0,0,4,1,2]}) 
df=df[['ID_Patient','Name_Patient','Visits_Jan','Visits_Feb','Visits_Mar']] 

df#The data set I wish to convert 
Out[318]: 
    ID_Patient Name_Patient Visits_Jan Visits_Feb Visits_Mar 
0  11132   Jim   2   5   5 
1  2755   Jack   1   0   0 
2  9753   Sue   0   0   0 
3  8453   Tom   4   1   1 
4  4872  James   2   1   1 

df_altered 
Out[317]: 
    ID_Patient Name_Patient Month_of_visit Col1 
0  11132   Jim  Visits_Jan  2 
1  11132   Jim  Visits_Feb  5 
2  11132   Jim  Visits_Mar  5 
3   2755   Jack  Visits_Jan  1 
4   2755   Jack  Visits_Feb  0 
5   2755   Jack  Visits_Mar  0 
6   9753   Sue  Visits_Jan  0 
7   9753   Sue  Visits_Feb  0 
8   9753   Sue  Visits_Mar  0 
9   8453   Tom  Visits_Jan  4 
10  8453   Tom  Visits_Feb  1 
11  8453   Tom  Visits_Mar  1 
12  4872  James  Visits_Jan  2 
13  4872  James  Visits_Feb  1 
14  4872  James  Visits_Mar  1 

回答

2

使用df.melt

df.melt(id_vars=['ID_Patient', 'Name_Patient'], 
     var_name='Month_of_visit', value_name='Col1') 
#  ID_Patient Name_Patient Month_of_visit Col1 
# 0  11132   Jim  Visits_Feb  5 
# 1   2755   Jack  Visits_Feb  0 
# 2   9753   Sue  Visits_Feb  0 
# 3   8453   Tom  Visits_Feb  1 
# 4   4872  James  Visits_Feb  1 
# 5  11132   Jim  Visits_Jan  2 
# 6   2755   Jack  Visits_Jan  1 
# 7   9753   Sue  Visits_Jan  0 
# 8   8453   Tom  Visits_Jan  4 
# 9   4872  James  Visits_Jan  2 
# 10  11132   Jim  Visits_Mar  0 
# 11  2755   Jack  Visits_Mar  0 
# 12  9753   Sue  Visits_Mar  4 
# 13  8453   Tom  Visits_Mar  1 
# 14  4872  James  Visits_Mar  2 
+0

非常感谢你。只是一个旁注 - 如果你的Pandas版本低于0.20.0,你需要'pandas.melt'而不是'DataFrame.melt'。因此,代码变成'pd.melt(df,id_vars = ['ID_Patient','Name_Patient'],var_name ='Month_of_visit',value_name ='Col1')' –

+0

这个答案值得更多的关注,因为它是习惯用法。为此目的创建了“pd.melt”和“pd.DataFrame.melt”。所以,很好的答案加上一个。 – piRSquared

3

通过使用stack

df.set_index(['ID_Patient','Name_Patient']).stack().reset_index() 
Out[254]: 
    ID_Patient Name_Patient  level_2 0 
0  11132   Jim Visits_Jan 2 
1  11132   Jim Visits_Feb 5 
2  11132   Jim Visits_Mar 0 
3   2755   Jack Visits_Jan 1 
4   2755   Jack Visits_Feb 0 
5   2755   Jack Visits_Mar 0 
6   9753   Sue Visits_Jan 0 
7   9753   Sue Visits_Feb 0 
8   9753   Sue Visits_Mar 4 
9   8453   Tom Visits_Jan 4 
10  8453   Tom Visits_Feb 1 
11  8453   Tom Visits_Mar 1 
12  4872  James Visits_Jan 2 
13  4872  James Visits_Feb 1 
14  4872  James Visits_Mar 2 

PS:改变t他列名使用.rename(columns={})

+0

完美地工作。非常感谢Wen! –

+0

这个答案对我来说很直观。 – piRSquared

+1

@piRSquared我从你身上学习堆叠和堆叠:-) – Wen

相关问题