【问题标题】:Transpose the DataFrame in pandas/python, but not all columns在 pandas/python 中转置 DataFrame,但不是所有列
【发布时间】:2017-10-13 16:13:19
【问题描述】:

我有一个像下面这样的 DataFrame。我尝试使用pivot 对其进行转置,但结果并不如我所愿。我想完成以下任务 -

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

【问题讨论】:

    标签: python pandas dataframe transactions


    【解决方案1】:

    通过使用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:使用.rename(columns={})更改列名

    【讨论】:

    • 完美运行。非常感谢温!!
    • 这个答案对我来说是直观的。
    【解决方案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
    

    【讨论】:

    • 非常感谢您。对其他人来说只是一个旁注——如果你的 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')
    • 这个答案值得更多关注,因为它是惯用的。 pd.meltpd.DataFrame.melt 正是为此目的而创建的。所以,很好的答案加一个。
    猜你喜欢
    • 2013-05-22
    • 1970-01-01
    • 1970-01-01
    • 2021-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-11
    • 2017-01-22
    相关资源
    最近更新 更多