gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 04:21:49 27 4
gpt4 key购买 nike

我不是 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 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

我想要完成的是为 _RT 和 _count 的 appName 创建新列,如下所示:

                       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 已被截断。

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

  1. 使用 set_index 将值移动到索引中

  2. 使用 unstack 将索引级别值移动到列索引中.

完成后,您只需重命名列即可压缩 MultiIndex转化为单一指数级别。这是通过重新分配 df.columns 来完成的。请注意,您可能更愿意跳过该步骤,因为 MultiIndex 提供 richer structure which may be useful在稍后阶段,如果您需要根据 appNamecountRT 选择列。

<小时/>

Id 列也被放置在索引中,以“保护”它免于被 unstack 操作分割。明白我的意思的最简单方法就是看一下Python 解释器中的 df.set_index(['appName'],append=True).unstack():

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

关于python - Pandas 使用另一列的值重命名/转置列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33587119/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com