【问题标题】:Pandas pivot with interchanging column values from duplicate row values熊猫从重复的行值中交换列值
【发布时间】:2020-08-20 06:58:52
【问题描述】:

我的数据具有如下所示的重复部分:

Part  |  Location |  ONHand 
A     |  XY       |  5 
A     |  XW       |  4 
B     |  XC       |  6 
B     |  XV       |  8 
C     |  XQ       |  9 

我正在尝试将其全部转换为每个零件一行,列出每个位置的所有位置和现有数量。

我尝试使用此代码

df_f = df.assign(cc=df.groupby('Part').cumcount()+1).set_index(['Part', 'cc']).unstack()
df_f.columns = [f'{col[0]}{col[1]}' for col in df_f.columns]
df_f.to_csv('parts_multi_location.csv')

但问题是它返回位置 1、2、3,然后返回 ONHand 1、2、3 等等。

我需要最终结果来返回 Location 1、Onhand 1、Location 2、Onhand 2、 所以标题应该是这样的:

Part | Location_1 | Onhand_1 | Location 2| Onhand 2
A    | XY         |   5      | XW        | 4
B    | XC         |   6      | XV        | 8
C    | XQ         |   9

【问题讨论】:

  • 请参考第11题关于复制的内容。使用f'{col[0]}_{col[1]}' 而不是f'{col[0]}{col[1]}'
  • @QuangHoang 我试过了,但它仍然先给我所有位置,然后是所有现有值
  • @ricsilo 我道歉。请在下面查看我的答案。

标签: python python-3.x excel pandas


【解决方案1】:

您完成了大部分工作。唯一缺少的是sort_index

df_f = df.assign(cc=df.groupby('Part').cumcount()+1).set_index(['Part', 'cc']).unstack()

# this is what you are missing
df_f = df_f.sort_index(level=(1,0), axis=1)

df_f.columns = [f'{col[0]}{col[1]}' for col in df_f.columns]

输出:

     Location1  ONHand1 Location2  ONHand2
Part                                      
A           XY      5.0        XW      4.0
B           XC      6.0        XV      8.0
C           XQ      9.0       NaN      NaN

【讨论】:

    【解决方案2】:

    IIUC,Quang 的解决方案要巧妙得多,但让我们看看如何使用标准库中的 Sorted 方法解决这个问题。

    如果你使用 f'{col[0]}_{col[1]}' 正如 Quang 所建议的那样,我们可以通过 _ 进行拆分以获取数值并使用它对列进行排序。

    d = {k : int(k.split('_')[1]) for k in df_f.columns}
    #{'Location_1': 1, 'Location_2': 2, 'ONHand_1': 1, 'ONHand_2': 2}
    
    
    df_f[sorted(d,key=d.get)]
             Location_1  ONHand_1 Location_2  ONHand_2
    Part                                          
    A            XY       5.0         XW       4.0
    B            XC       6.0         XV       8.0
    C            XQ       9.0        NaN       NaN
    

    【讨论】:

      猜你喜欢
      • 2020-02-11
      • 2023-01-26
      • 2019-02-05
      • 2021-09-02
      • 2019-07-12
      • 2018-08-24
      • 1970-01-01
      • 1970-01-01
      • 2016-05-28
      相关资源
      最近更新 更多