将pandas pivot表展开为一级索引

2024-05-29 05:42:00 发布

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

对于我从一个数据帧开始的分析,它看起来像这样(但要大得多):

      ID1        ID2           type       Number
0     IE345      E90              I           38
1     IE345      E92              E           26
2     IE345      E93              E           21
3     IE345      E95              R            9
4     IE346      E94              I           41
7     IE346      BLK              E            1

我想取消激活以下数据帧:

Df1 = pd.pivot_table(loads, values=['Number'], 
                       index = ['ID1', 'ID2'], 
                       columns=['Type'], margins=True, 
                       aggfunc=[sum] , fill_value=0)

Df1:

^{pr2}$

进入:

Df1:

ID1        ID2                   B     D     E     I    L     R    All                                                                         
IE345      E90                   0     0     0    38    0     0     38    
IE345      E92                   0     0    26     0    0     0     26    
IE345      E93                   0     0    21     0    0     0     21    
IE345      E95                   0     0     0     0    0     9      9    
IE346      E94                   0     0     0    41    0     0     41    
IE346      BLK                   0     0     1     0    0     0      1

看来熊猫。融化是我要找的,但无法成功。在

之后,我想添加一行中最高值的列名,当然不加边距:

ID1        ID2                   B     D     E     I    L     R    All   Max                                                                        
IE345      E90                   0     0     0    38    0     0     38    I    
IE345      E92                   0     0    26     0    0     0     26    E
IE345      E93                   0     0    21     0    6     0     27    E
IE345      E95                   0     0     0     0    0     9      9    R
IE345      E94                   0     0     0    41    0     0     41    I
IE345      BLK                   0     0     1     0    1     0      2    E

对于最大值,我使用:

df['Max'] = df.idxmax(axis=1, skipna=True)

但不幸的是,这一切都带走了。有什么想法可以让我以最有效的方式实现我的目标?在

!!!编辑!!!!

对于第一部分,我构建了一个返回exacte unpivot pivot表的解决方案!代码如下:

df.columns = df.columns.get_level_values('Type')
df.reset_index(inplace=True)

现在,我尝试了Vmg的最大值解决方案,但不幸的是,它返回:

ValueError: could not convert string to float: 

有什么办法解决这个问题吗?在


Tags: columns数据truedfdf1id2id1blk
2条回答

您描述的第一个转换似乎没有必要,因为似乎您仍然希望ID1和{}作为索引。第一种表示就是pandas如何显示多个索引,而不必为第二个条目重复第一个索引。在

您手头的问题是,应用idxmax而不使用所有这些可以通过以下方法实现:

proef['Dominant'] = proef.iloc[:,:-1].idxmax(axis=1, skipna=True)

其中iloc[:,:-1]只是表示忽略了最右边的列。在

正如@vmg已经说过的,idxmax会做到这一点:

import io
import StringIO     # for Python 2.X
import pandas as pd

data = """\
      id1        id2           type       number
0     IE345      E90              I           38
1     IE345      E92              E           26
2     IE345      E93              E           21
3     IE345      E95              R            9
4     IE346      E94              I           41
7     IE346      BLK              E            1
"""

#loads = pd.read_csv(io.StringIO(data), sep='\s+', index_col=0)  # for Python 3.X
loads = pd.read_csv(StringIO.StringIO(data), sep='\s+', index_col=0)  # for Python 2.X

# **** interesting part starts here ****

# save all unique types, we will use it later
types = loads.type.unique()

df = pd.pivot_table(loads, values=['number'], 
                       index = ['id1', 'id2'], 
                       columns=['type'], margins=True, 
                       aggfunc='sum', fill_value=0) \
       .reset_index()

# reset column names
df.columns = [c[1] if c[1] else c[0] for c in df.columns.tolist()]

df['max'] = df[types].idxmax(axis=1)

输出:

^{pr2}$

相关问题 更多 >

    热门问题