首页 > 解决方案 > 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

我在这里错过了什么?我看不出我在哪里搞砸了

标签: pythonpandasdataframe

解决方案


国际大学联合会,

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

推荐阅读