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

2024-10-04 03:16:49 发布

您现在位置:Python中文网/ 问答频道 /正文

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

                       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为\u RT和\u count创建新列,如下所示:

^{pr2}$

我的第一个想法是使用transpose(),但我觉得必须有其他方法来实现这一点。老实说,我只是有点迷路了。任何帮助都将不胜感激。非常感谢。在


Tags: 数据idcount专家rtappnameapp1app2
1条回答
网友
1楼 · 发布于 2024-10-04 03:16:49
df = df.set_index(['Id', 'appName'], append=True).unstack()
df.columns = ['{}{}'.format(name, id) for id, name in df.columns]

收益率

^{pr2}$

为了可读性,Id被截断。在

请注意,appName列中的是所需数据帧中的列名。 将值从列移到列索引可以分两步执行:

  1. 使用^{}

  2. 使用^{}将索引级别的值移动到列索引中。

完成后,只需重命名列,将MultiIndex压缩到单个索引级别。这是通过重新分配给df.columns完成的。请注意,您可能更愿意跳过这一步,因为如果您需要根据appName或{}或{}选择列,那么MultiIndex将在以后的阶段提供richer structure which may be useful。在


Id列也被放在索引中,以“保护”它不被unstack操作拆分。要明白我的意思,最简单的方法就是看看 df.set_index(['appName'], append=True).unstack()在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

相关问题 更多 >