给定一个数据框:
a b c
u 5 0 3
v 3 7 9
w 3 5 2
我想使用函数选择数据框中的行/列。该函数获取数据帧并返回标签列表的元组,例如它使用这个 lambda 返回
['v', 'u'], ['c']
:
get_labels = lambda df: (['v', 'u'], ['c'])
如果我将
.loc
与标签文字一起使用,我会得到所需的结果:
df.loc[['v', 'u'], ['c']]
c
v 9
u 3
文档说关于使用函数(可调用),返回两个标签列表的函数是有效的(“以上之一”):
具有一个参数(调用 Series 或 DataFrame)的可调用函数,并返回用于索引的有效输出(上述之一)
但是,如果我将
.loc
与函数一起使用,我相信该函数返回相同的列表元组,则会收到错误:
df.loc[get_labels]
unhashable type: 'list'
怎么了? (作为一个可能的线索:Pandas 似乎试图用函数的结果创建一个
Index
对象——不知道为什么,文档中没有解释。)
完整代码:
import numpy.random as npr
import pandas as pd
npr.seed(0)
df = pd.DataFrame(npr.randint(10, size=(3,3)),
index=['u','v','w'],
columns=['a','b','c'])
get_labels = lambda df: (['v', 'u'], ['c'])
print(df.loc[['v', 'u'], ['c']])
print(df.loc[get_labels])
您需要调用您的函数:
df.loc[get_labels(df)]
链式使用:
df.pipe(lambda x: x.loc[get_labels(x)])
输出:
c
v 9
u 3