You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过axis参数便捷获取pandas DataFrame的行或列切片?

如何通过axis参数快速实现DataFrame的行/列切片

我希望通过axis参数指定行或列,来获取pandas.DataFrame的切片,也就是实现下方代码中_loc_axis函数的功能,请问有没有更简便的实现方式?

原实现代码:

import pandas as pd

def _loc_axis(df, idx, axis):
    """Call loc along proper axis"""
    # Axis as integer, error if axis is invalid
    axis = {0: 0, 'index': 0,
            1: 1, 'columns': 1}[axis]
    return (df.loc[idx, :] if axis==0 else
            df.loc[:, idx])

df = pd.DataFrame(
    data=[[1,2,3], [4,5,6], [7,8,9]],
    index=['a','b','c'],
    columns=['D','E','F'],
)

print(df)
print(_loc_axis(df, ['a','b'], axis='index'))
print(_loc_axis(df, ['F','D'], axis='columns'))

原代码运行输出:

D  E  F
a  1  2  3
b  4  5  6
c  7  8  9

   D  E  F
a  1  2  3
b  4  5  6

   F  D
a  3  1
b  6  4
c  9  7

几种更简便的实现方式

1. 用reindex原生方法(最简洁)

pandas.DataFrame.reindex()本身支持axis参数,可直接传入行/列标签列表,完全覆盖原函数需求,还能自动处理标签不存在的情况(可选丢弃或补NaN):

def loc_axis(df, idx, axis):
    return df.reindex(idx, axis=axis)

测试后输出和原函数完全一致,且无需自行处理axis的字符串转整数逻辑,pandas原生支持axis='index'或axis='columns'。

2. 简化loc的调用逻辑

如果坚持用loc,可以通过构造索引元组简化代码,避免分支判断:

def loc_axis(df, idx, axis):
    # 根据axis构造loc的索引参数
    loc_args = (idx, slice(None)) if axis in [0, 'index'] else (slice(None), idx)
    return df.loc[loc_args]

这里用slice(None)替代:,效果完全相同,代码更紧凑。

3. 用take方法(适合按位置切片)

如果你的idx是位置索引而非标签,take方法更高效,同样支持axis参数:

def loc_axis(df, idx, axis):
    return df.take(idx, axis=axis)

如果需要从标签转位置,可配合get_indexer:

def loc_axis(df, idx, axis):
    pos = df.index.get_indexer(idx) if axis in [0, 'index'] else df.columns.get_indexer(idx)
    return df.take(pos, axis=axis)

内容的提问来源于stack exchange,提问作者LogZ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 10:20:16