我试图从一个看起来像这样的现有数据帧构建一个数据帧,我现在知道pivot方法可以解决问题,但是我想知道为什么它不能通过引用“数量”列的“ obs”列在新的df中。感觉除了枢转之外,在某些情况下了解也是有用的。
Id Quantity obs
1 100121 113.0 0
2 100121 104.0 1
3 100121 -11.0 2
4 100122 220.0 0
5 100122 167.0 1
6 100122 100.0 2
我想获得以下结果:
Id m1 m2 m3
1 100121 -11 104.0 113
4 100122 100 167 220
我尝试这样做:
df_histo = pd.DataFrame(data11['Id'].drop_duplicates(keep='first'))
df_histo['m1'] = data11['Quantity'].loc[data11['obs']==2]
df_histo['m2'] = data11['Quantity'].loc[data11['obs']==1]
df_histo['m3'] = data11['Quantity'].loc[data11['obs']==0]
由于某些原因,我一直得到这个输出:
Id m1 m2 m3
1 100121 NaN NaN NaN
4 100122 NaN NaN NaN
我在这里错过了什么?我看不到我在搞砸
答案 0 :(得分:1)
IIUC,
df.pivot('Id','obs','Quantity').rename(columns=lambda x: f'm{x+1}')
输出:
obs m1 m2 m3
Id
100121 113.0 104.0 -11.0
100122 220.0 167.0 100.0
您缺少内在数据对齐的概念,这意味着熊猫希望使用索引来对齐数据。
要修复代码,您需要从语句的右侧剥离索引,将pd.Series转换为一维numpy数组。
df_histo = pd.DataFrame(data11['Id'].drop_duplicates(keep='first'))
df_histo['m1'] = data11['Quantity'].loc[data11['obs']==2].to_numpy()
df_histo['m2'] = data11['Quantity'].loc[data11['obs']==1].to_numpy()
df_histo['m3'] = data11['Quantity'].loc[data11['obs']==0].to_numpy()
输出:
Id m1 m2 m3
1 100121 -11.0 104.0 113.0
4 100122 100.0 167.0 220.0
但是,这仍然不是执行此索引和选择的最佳方法,更好的方法是这样的:
df_histo['m1'] = data11.loc[data11['obs'] == 2, 'Quantity'].to_numpy()
df_histo['m2'] = data11.loc[data11['obs'] == 1, 'Quantity'].to_numpy()
df_histo['m3'] = data11.loc[data11['obs'] == 0, 'Quantity'].to_numpy()
df_histo
输出:
Id m1 m2 m3
1 100121 -11.0 104.0 113.0
4 100122 100.0 167.0 220.0