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
我正在尝试满足计算 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