如何解决在熊猫对象上建立索引后,获取索引/列的选定位置
在对熊猫对象建立索引后如何获取索引/列的选定位置?
例如,对于索引操作.iloc[[0,1],0]
,我想获取索引[0,1]
和0
。我的用例要求传递一个任意的索引函数(例如loc
或iloc
并检索它选择的索引。目前,我可以通过广播熊猫对象形状的简单范围,运行索引功能并将结果值用作选定索引来实现此目的。这种方法的问题在于,它需要两个索引操作,一个用于找到索引的选定索引,另一个用于列。此外,它无法分辨.iloc[[0],0]
和.iloc[0,[0]]
之间的区别。我还尝试比较新标签和旧标签,但这是不可靠的,因为索引可以更改标签或标签可以重复。
这是我的函数的样子:
def get_selected_idxs(obj,pd_indexing_func):
n_rows = len(obj.index)
if obj.ndim == 1:
idx_mapper = pd.Series(np.arange(n_rows),index=obj.index)
idx_mapper = pd_indexing_func(idx_mapper)
if isinstance(idx_mapper,pd.Series):
idx_idxs = idx_mapper.values
else:
idx_idxs = idx_mapper
col_idxs = 0
else:
n_cols = len(obj.columns)
idx_mapper = pd.DataFrame(
np.broadcast_to(np.arange(n_rows)[:,None],(n_rows,n_cols)),index=obj.index,columns=obj.columns
)
idx_mapper = pd_indexing_func(idx_mapper)
col_mapper = pd.DataFrame(
np.broadcast_to(np.arange(n_cols),columns=obj.columns
)
col_mapper = pd_indexing_func(col_mapper)
if isinstance(idx_mapper,pd.DataFrame):
idx_idxs = idx_mapper.values[:,0]
col_idxs = col_mapper.values[0]
elif isinstance(idx_mapper,pd.Series):
one_col = np.all(col_mapper.values == col_mapper.values.item(0))
one_idx = np.all(idx_mapper.values == idx_mapper.values.item(0))
if one_col and one_idx:
# One index and one column selected
raise Exception("Must select at least two unique indices in one of both axes")
elif one_col:
# One column selected
idx_idxs = idx_mapper.values
col_idxs = col_mapper.values[0]
elif one_idx:
# One index selected
idx_idxs = idx_mapper.values[0]
col_idxs = col_mapper.values
else:
idx_idxs = idx_mapper
col_idxs = col_mapper
return idx_idxs,col_idxs
print(get_selected_idxs(pd.Series([0,1,2]),lambda x: x.iloc[0]))
# (0,0)
print(get_selected_idxs(pd.Series([0,lambda x: x.iloc[:2]))
# (array([0,1]),0)
print(get_selected_idxs(pd.DataFrame([[0,[2,3]]),lambda x: x.iloc[0,0]))
# (0,lambda x: x.iloc[:2,0]))
# (array([0,:2]))
# (0,array([0,1]))
print(get_selected_idxs(pd.DataFrame([[0,:2]))
# (array([0,1]))
我正在寻找的是实现这一目标的任何熊猫本机方法,还是可以涵盖所有这些情况的更快的解决方法。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。