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
非常感谢您如此深入的解释。我稍后会尽快尝试,并将此标记为已回答。