我有一个像numpy数组
np.array([[1.0, np.nan, 5.0, 1, True, True, np.nan, True],
[np.nan, 4.0, 7.0, 2, True, np.nan, False, True],
[2.0, 5.0, np.nan, 3, False, False, True, np.nan]], dtype=object)
Run Code Online (Sandbox Code Playgroud)
现在我想用key作为isnan对值进行排序?我怎样才能做到这一点?所以我最终会在阵列中
np.array([[1.0, 5.0, 1, True, True, True, np.nan, np.nan],
[4.0, 7.0, 2, True, False, True, np.nan, np.nan],
[2.0, 5.0, 3, False, False, True, np.nan, np.nan]], dtype=object)
Run Code Online (Sandbox Code Playgroud)
np.sort()没用.在pandas中可以实现相同的sorted功能,通过使用带有键的函数的已排序列作为pd.isnull(),但寻找速度的numpy答案.
在熊猫里
data = pd.DataFrame({'Key': [1, 2, 3], 'Var': [True, True, False], 'ID_1':[1, np.NaN, 2],
'Var_1': [True, np.NaN, False], 'ID_2': [np.NaN, 4, 5], 'Var_2': [np.NaN, False, True],
'ID_3': [5, 7, np.NaN], 'Var_3': [True, True, np.NaN]})
data.apply(lambda x : sorted(x,key=pd.isnull),1).values
Run Code Online (Sandbox Code Playgroud)
输出:
array([[1.0, 5.0, 1, True, True, True, nan, nan],
[4.0, 7.0, 2, True, False, True, nan, nan],
[2.0, 5.0, 3, False, False, True, nan, nan]], dtype=object)
Run Code Online (Sandbox Code Playgroud)
方法#1
这里有一个量化的方法借用的概念,masking从this post-
def mask_app(a):
out = np.empty_like(a)
mask = np.isnan(a.astype(float))
mask_sorted = np.sort(mask,1)
out[mask_sorted] = a[mask]
out[~mask_sorted] = a[~mask]
return out
Run Code Online (Sandbox Code Playgroud)
样品运行 -
# Input dataframe
In [114]: data
Out[114]:
ID_1 ID_2 ID_3 Key Var Var_1 Var_2 Var_3
0 1.0 NaN 5.0 1 True True NaN True
1 NaN 4.0 7.0 2 True NaN False True
2 2.0 5.0 NaN 3 False False True NaN
# Use pandas approach for verification
In [115]: data.apply(lambda x : sorted(x,key=pd.isnull),1).values
Out[115]:
array([[1.0, 5.0, 1, True, True, True, nan, nan],
[4.0, 7.0, 2, True, False, True, nan, nan],
[2.0, 5.0, 3, False, False, True, nan, nan]], dtype=object)
# Use proposed approach and verify
In [116]: mask_app(data.values)
Out[116]:
array([[1.0, 5.0, 1, True, True, True, nan, nan],
[4.0, 7.0, 2, True, False, True, nan, nan],
[2.0, 5.0, 3, False, False, True, nan, nan]], dtype=object)
Run Code Online (Sandbox Code Playgroud)
方法#2
几乎没有修改,简化版本的想法来自this post-
def mask_app2(a):
out = np.full(a.shape,np.nan,dtype=a.dtype)
mask = ~np.isnan(a.astype(float))
out[np.sort(mask,1)[:,::-1]] = a[mask]
return out
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
234 次 |
| 最近记录: |