Python 到 return 数据帧值在 NaN 之前被屏蔽

Python to return dataframe values masked before NaN

我正在尝试满足计算 Zscore 并希望与行中的各个值进行比较的要求。如果 Zscore>1 ,我将这些特定值标记为 NaN 。我将其标记为 NaN,以便我可以通过适当的技术填充这些值,然后我还想 return 一个数据框,它会告诉我原始 NaN 值是什么。

我有以下代码:

s={'2014':[1,1,2,2],'2015':[12,22,33,44],'2016':[55,66,77,88],'2017':[2,3,4,5]}
p=pd.DataFrame(data=s)

     2014 2015 2016 2017
   0    1   12  55   2
   1    1   22  66   3
   2    2   33  77   4
   3    2   44  88   5

我将 zscore 计算为 -

df_zscore = (p - p.mean())/p.std()

       2014       2015        2016       2017
0   -0.866025   -1.139879   -1.161895   -1.161895
1   -0.866025   -0.416146   -0.387298   -0.387298
2   0.866025    0.379960    0.387298    0.387298
3   0.866025    1.176065    1.161895    1.161895


out = p.mask(df_zscore > 1)

如果Zscore>1,那么输出是这样的-

       2014       2015        2016       2017
0      1          12          55         2
1      1          22          66         3
2      2          33          77         4
3      2          NaN         NaN       NaN

(它们被标记为 NaN,因为 Zscore >1)

我想写一个代码,它基本上会跟踪值,即不是 NaN 但由于 Zscore 限制而变成 NaN 的值,所以理想情况下我应该得到下面的数据框。

想要O/P-

   2015       2016       2017
3    44       88          5

我怎样才能做到这一点?

我知道因为我的数据集很小,我可以通过查看数据很容易地弄清楚这一点,但是当数据集很大时,那才是我真正需要查看它的时候。

您可以通过比较更大的 1 来过滤行和列,然后传递 DataFrame.any for test at least one match per rows and columns and filter in DataFrame.loc:

m = df_zscore.gt(1)
out = p.loc[m.any(axis=1), m.any()]
print (out)
   2015  2016  2017
3    44    88     5

但如果匹配多行和多列解决方案过滤所有行和列,其中至少有一个匹配:

s={'2014':[10,1,2,2],'2015':[12,22,33,44],'2016':[55,66,77,88],'2017':[2,3,4,5]}
p=pd.DataFrame(data=s)

df_zscore = (p - p.mean())/p.std()

print (p.mask(df_zscore > 1))
   2014  2015  2016  2017
0   NaN  12.0  55.0   2.0
1   1.0  22.0  66.0   3.0
2   2.0  33.0  77.0   4.0
3   2.0   NaN   NaN   NaN

m = df_zscore.gt(1)
out = p.loc[m.any(axis=1), m.any(axis=0)]
print (out)
   2014  2015  2016  2017
0    10    12    55     2
3     2    44    88     5

所以如果只需要匹配值就需要不同的格式:

m = df_zscore.gt(1)
out = p.stack()[m.stack()].rename_axis(['idx','year']).reset_index(name='val')
print (out)
   idx  year  val
0    0  2014   10
1    3  2015   44
2    3  2016   88
3    3  2017    5

或者不匹配的值转换为缺失值:

m = df_zscore.gt(1)
out = p.loc[m.any(axis=1), m.any(axis=0)].where(m)
print (out)
   2014  2015  2016  2017
0  10.0   NaN   NaN   NaN
3   NaN  44.0  88.0   5.0