我无法按条件访问多索引/列DataFrame的值。
df = pd.DataFrame(np.arange(16).reshape(4,4),
index=[['a', 'a', 'b', 'b'], ["c", "d", "c", "d"]],
columns=[['cat1', 'cat1', 'cat2', 'cat2'], ['vals1', 'vals2', 'vals1', 'vals2']]) cat1 cat2
vals1 vals2 vals1 vals2
a c 0 1 2 3
d 4 5 6 7
b c 8 9 10 11
d 12 13 14 15我知道如何通过它们的位置来访问值。
df.loc[("a", "c"), ("cat1", "vals1")]
df.loc[(slice(None), "d"), ("cat1", slice(None))]但是如何使用这里的条件
例如,在列("cat1","vals2")中选择值("cat2","vals2")==7
发布于 2022-04-11 11:05:21
在DataFrame.loc中使用元组
a = df.loc[df[("cat2", "vals2")] == 7, ('cat1', 'vals1')]
print (a)最后,如果需要来自一个元素Series的标量
out = a.iat[0]如果可能的话,没有匹配:
out = next(iter(a), 'no match')您可以比较切片行、列(输出由布尔值填充的DataFrame ),因此对于布尔Series,需要测试DataFrame.any是否为每行的真或DataFrame.all为每行的所有真实值。
m = df.loc[:, ("cat2", slice(None))]==7
a = df.loc[m.any(axis=1), ("cat1", "vals2")]
print (a)
a d 5
Name: (cat1, vals2), dtype: int32m = df.loc[:, ("cat2", slice(None))]==7
df2 = df.loc[m.any(axis=1), ("cat1", slice(None))]
print (df2)
cat1
vals1 vals2
a d 4 5发布于 2022-04-11 11:05:29
您可以将loc与布尔索引结合使用
df.loc[df[('cat2', 'vals2')].eq(7), ('cat1', 'vals2')]产出:
a d 5
Name: (cat1, vals2), dtype: int64发布于 2022-04-11 11:34:11
与@mozway非常相似的一种方法是使用pd.IndexSlice,正如熊猫博士在“使用片”部分中所建议的那样。
idx = pandas.IndexSlice
mask = df[('cat2', 'vals2')]==7
df.loc[idx[mask], idx['cat1', "vals2"]]https://stackoverflow.com/questions/71826690
复制相似问题