python - pandas:带有 loc[] 的 NaN 结果
问题描述
我正在尝试从一个看起来像这样的现有数据框构建一个数据框,我现在知道枢轴方法可以解决问题,但我想知道为什么它不能在新的“数量”列中引用“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
我在这里错过了什么?我看不出我在哪里搞砸了
解决方案
国际大学联合会,
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
推荐阅读
- javascript - mapsvg:有没有办法用线性渐变代替纯色?
- django - self.assertEqual(response.status_code, status.HTTP_200_OK) AssertionError: 404 != 200
- javascript - 单击 Javascript 中的文本时发生 Swal.fire (Sweetalert)
- reactjs - 使组件可选择受控或不受控
- c++ - 我想在组合/整个类的成员初始化器列表中初始化“部分”类的数组
- arduino - Arduino - 灯的持续时间超过预期
- javascript - 如何测试一个函数?
- java - 如何将数据从活动传递到地理围栏广播接收器?
- excel - 将 sheet2 第一行的最后一列与 sheet1 的 F2 单元格进行比较,如果匹配,则显示 msgbox,否则将 F2 范围粘贴到 sheet2
- python - 我在 pygame 中创建了一个没有动画的基本平台游戏。我已经为左右移动使用了事件处理,但我无法添加跳跃机制