Python 通过isin将数据帧列有条件地放在标签引用的行值上

Python 通过isin将数据帧列有条件地放在标签引用的行值上,python,pandas,Python,Pandas,我有一个宽格式的熊猫数据帧。我希望根据行的值与列表的比较来对列进行子集划分(我希望通过其标签来引用该行) 例如考虑以下数据集: import pandas as pd import numpy as np import random y = pd.DataFrame({'one': pd.Series(random.sample(range(100), 5), index=list('abcde')), 'two': pd.Series(random.samp

我有一个宽格式的熊猫数据帧。我希望根据行的值与列表的比较来对列进行子集划分(我希望通过其标签来引用该行)

例如考虑以下数据集:

import pandas as pd
import numpy as np
import random

y = pd.DataFrame({'one': pd.Series(random.sample(range(100), 5), index=list('abcde')),
                 'two': pd.Series(random.sample(range(100), 5),
                 index=list('abcde')),
                 'three': pd.Series(list('ABCDE'), index=list('abcde'))})
我有一组用于比较的值:

myset = {83, 17}
现在,假设我想要一个数据帧,其中我们有所有行,但只有列,其中行
'd'
myset
中有值

我期望的结果是:

但是,根据集合中的行标签和值,我在提取它时遇到困难

这给出了一个适当的布尔向量:

y.loc['d'].isin(myset)
然而,我无法使用该布尔值以我期望的方式进行子集划分,例如

y.iloc[:,y.loc['d'].isin(myset)]
ValueError:基于iLocation的布尔索引不能使用可索引的 假面


澄清:这个问题的一个重要标准是,我只是将感兴趣的行(上例中的“d”行)与
myset
进行比较。我不在乎其他行是否在
myset
中有值。

您可以使用
apply
获取掩码,然后
.loc

y.loc[:, y.apply(lambda col: col.d in myset)]
输出:

   one  two
a   76   94
b   46   36
c   28   86
d   83   17
e   15   98

您可以使用
apply
获取掩码,然后使用
.loc

y.loc[:, y.apply(lambda col: col.d in myset)]
输出:

   one  two
a   76   94
b   46   36
c   28   86
d   83   17
e   15   98

或者我们使用
replace
isnull

df.loc[:,df.replace(dict(zip(list(myset), [np.nan]*len(myset)))).isnull().any().values]
Out[907]: 
   one  two
a   76   94
b   46   36
c   28   86
d   83   17
e   15   98
编辑:

df.loc[:,df.loc[['d']].replace(dict(zip(list(myset), [np.nan]*len(myset)))).isnull().any().values]

或者我们使用
replace
isnull

df.loc[:,df.replace(dict(zip(list(myset), [np.nan]*len(myset)))).isnull().any().values]
Out[907]: 
   one  two
a   76   94
b   46   36
c   28   86
d   83   17
e   15   98
编辑:

df.loc[:,df.loc[['d']].replace(dict(zip(list(myset), [np.nan]*len(myset)))).isnull().any().values]

对于您的示例,一个更好的用例是其中一个数字列匹配而另一个不匹配,例如,
myset={83,16}
@andrew_-reece伟大的答案+1我有几乎相同的解决方案。对于您的示例,更好的用例是其中一个数字列匹配而另一个不匹配,例如,
myset={83,16}
@andrew_reece回答得很好+1我有几乎相同的解决方案。@Hack-R抱歉误解了问题,请检查edit@Hack-R抱歉误解了问题,请检查编辑