Select Pandas DataFrame 中的所有行,通过传入字符串或其他对象来定位

Select all rows in a Pandas DataFrame with loc by passing in a string or other object

我正在编写一个函数,该函数 select 是 pandas DataFrame 中行的子集。

函数看起来像这样,

def get_predictions(df: pd.DataFrame, subset: str) -> pd.DataFrame:
    return df['properties', 'prediction'].loc[subset]

我希望此函数能够处理我想要 select DataFrame 中所有行的情况。一种解决方案是将子集参数默认设置为 None,如果子集参数设置为 None.

,则将整个 DataFrame 设置为 return
def get_predictions(df: pd.DataFrame, subset: str) -> pd.DataFrame:
    if subset is None:
        return df['properties', 'prediction']
    else:
        return df['properties', 'prediction'].loc[subset]

我不喜欢这个解决方案,因为我重复了很多代码。有没有更好的解决方案,不涉及重复。具体来说,是否有一个我可以传递给 .loc[] 的对象,它会 return DataFrame 中的所有行?

这是我正在寻找的理想解决方案,

def get_predictions(df: pd.DataFrame, subset=MysteryObject) -> pd.DataFrame:
    return df['properties', 'prediction'].loc[MysteryObject]

是否有 MysteryObject 可以实现这种期望的行为?

直接传入

subset = df.index

此外,最好使用 .loc 对行和列进行子集化。这样,您就可以查看子集,而不是先生成列的副本。 就这样吧

df.loc[subset, ['properties', 'prediction']]

让我们尝试将默认值设置为 slice(None) 而不是 None:

def get_predictions(
        df: pd.DataFrame, subset: str = slice(None)
) -> pd.DataFrame:
    return df[['properties', 'prediction']].loc[subset]

尽管在一步中对两个轴进行子集化会更好:

def get_predictions(
        df: pd.DataFrame, subset: str = slice(None)
) -> pd.DataFrame:
    return df.loc[subset, ['properties', 'prediction']]

slice(None) 等同于 :,只是它可以赋值给一个变量。

df.loc[:, 'col'] == df.loc[slice(None), 'col']

测试代码:

test_df = pd.DataFrame({'properties': [1, 2, 3],
                        'prediction': [4, 5, 6],
                        'other': [7, 8, 9]},
                       index=['a', 'b', 'c'])

print('Subset \'a\'')
print(get_predictions(test_df, 'a'))
print('No Subset')
print(get_predictions(test_df))

输出:

Subset 'a'
properties    1
prediction    4
Name: a, dtype: int64

No Subset
   properties  prediction
a           1           4
b           2           5
c           3           6