我有重复部分的数据,如下所示:
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,依此类推。
我需要最终结果以返回位置1,手1,位置2,手2, 因此标题应该如下所示:
Part | Location_1 | Onhand_1 | Location 2| Onhand 2
A | XY | 5 | XW | 4
B | XC | 6 | XV | 8
C | XQ | 9
答案 0 :(得分:2)
您完成了大部分工作。唯一缺少的是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
答案 1 :(得分:0)
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