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抱歉误解了问题,请检查编辑