Python 使用另一列中的值重命名/转置列

Python 使用另一列中的值重命名/转置列,python,pandas,dataframe,Python,Pandas,Dataframe,我不是熊猫专家,所以我很难确切地知道如何完成一个非常简单的数据帧操作。我有一个如下所示的数据帧: Id appName _RT _count 0 ef9fdeed-a9ad-4680-b8e9-9e5e10ae2593 App1 0.003000 1 1 ef9fdeed-a9ad-4680-b8e9-9e5e10ae2593 App2 0.026000

我不是熊猫专家,所以我很难确切地知道如何完成一个非常简单的数据帧操作。我有一个如下所示的数据帧:

                       Id              appName       _RT      _count
0    ef9fdeed-a9ad-4680-b8e9-9e5e10ae2593      App1  0.003000       1
1    ef9fdeed-a9ad-4680-b8e9-9e5e10ae2593      App2  0.026000       1
2    ef9fdeed-a9ad-4680-b8e9-9e5e10ae2593      App3  0.029000       1
3    ef9fdeed-a9ad-4680-b8e9-9e5e10ae2593      App2  0.052000       2
4    ef9fdeed-a9ad-4680-b8e9-9e5e10ae2593      App2  0.070000       1
5    ef9fdeed-a9ad-4680-b8e9-9e5e10ae2593      App1  0.124000       2
6    f03eaf42-9080-43c8-a892-f910fa442ee6      App3  0.060000       1
我试图完成的是为appName为_RT和_count创建新列,如下所示:

                       Id              appName       App1_RT      App1_count   App2_RT  App2_count  App3_RT    App3_count
0    ef9fdeed-a9ad-4680-b8e9-9e5e10ae2593      App1  0.003000       1
1    ef9fdeed-a9ad-4680-b8e9-9e5e10ae2593      App2                           0.026000     1
2    ef9fdeed-a9ad-4680-b8e9-9e5e10ae2593      App3                                                 0.029000       1
3    ef9fdeed-a9ad-4680-b8e9-9e5e10ae2593      App2                           0.052000       2
4    ef9fdeed-a9ad-4680-b8e9-9e5e10ae2593      App2                           0.070000       1
5    ef9fdeed-a9ad-4680-b8e9-9e5e10ae2593      App1  0.124000       2
6    f03eaf42-9080-43c8-a892-f910fa442ee6      App3                                                0.060000       1
我的第一个想法是使用
transpose()
,但我觉得必须有其他方法才能做到这一点。老实说,我只是有点迷失了最好的方法。任何帮助都将不胜感激。多谢各位

df = df.set_index(['Id', 'appName'], append=True).unstack()
df.columns = ['{}{}'.format(name, id) for id, name in df.columns]
屈服

            App1_RT  App2_RT  App3_RT  App1_count  App2_count  App3_count
  Id                                                                     
0 ef9fdeed    0.003      NaN      NaN           1         NaN         NaN
1 ef9fdeed      NaN    0.026      NaN         NaN           1         NaN
2 ef9fdeed      NaN      NaN    0.029         NaN         NaN           1
3 ef9fdeed      NaN    0.052      NaN         NaN           2         NaN
4 ef9fdeed      NaN    0.070      NaN         NaN           1         NaN
5 ef9fdeed    0.124      NaN      NaN           2         NaN         NaN
6 f03eaf42      NaN      NaN    0.060         NaN         NaN           1
Id
s因可读性而被截断

请注意,
appName
列中的值是所需数据帧中的列名。 可以通过两个步骤将值从列移动到列索引中:

  • 使用将值移动到索引中

  • 使用将索引级别值移动到列索引中

  • 完成后,只需重命名列,即可将数据压缩到单个索引级别。这是通过重新分配到
    df.columns
    来完成的。请注意,如果需要基于
    appName
    count
    RT
    选择列,您可能更愿意跳过该步骤,因为多索引在后面的阶段提供了这一点


    Id
    列也被放置在索引中,以“保护”它不被
    unstack
    操作拆分。要理解我的意思,最简单的方法就是看看
    df.set_index(['appName'],append=True)。在Python解释器中取消堆栈()

    In [144]: df.set_index(['appName'], append=True).unstack()
    Out[144]: 
                   Id                        _RT               _count          
    appName      App1      App2      App3   App1   App2   App3   App1 App2 App3
    0        ef9fdeed       NaN       NaN  0.003    NaN    NaN      1  NaN  NaN
    1             NaN  ef9fdeed       NaN    NaN  0.026    NaN    NaN    1  NaN
    2             NaN       NaN  ef9fdeed    NaN    NaN  0.029    NaN  NaN    1
    3             NaN  ef9fdeed       NaN    NaN  0.052    NaN    NaN    2  NaN
    4             NaN  ef9fdeed       NaN    NaN  0.070    NaN    NaN    1  NaN
    5        ef9fdeed       NaN       NaN  0.124    NaN    NaN      2  NaN  NaN
    6             NaN       NaN  f03eaf42    NaN    NaN  0.060    NaN  NaN    1
    

    In [145]: df.set_index(['Id', 'appName'], append=True).unstack()
    Out[145]: 
                  _RT               _count          
    appName      App1   App2   App3   App1 App2 App3
      Id                                            
    0 ef9fdeed  0.003    NaN    NaN      1  NaN  NaN
    1 ef9fdeed    NaN  0.026    NaN    NaN    1  NaN
    2 ef9fdeed    NaN    NaN  0.029    NaN  NaN    1
    3 ef9fdeed    NaN  0.052    NaN    NaN    2  NaN
    4 ef9fdeed    NaN  0.070    NaN    NaN    1  NaN
    5 ef9fdeed  0.124    NaN    NaN      2  NaN  NaN
    6 f03eaf42    NaN    NaN  0.060    NaN  NaN    1
    

    非常感谢您如此深入的解释。我稍后会尽快尝试,并将此标记为已回答。