从这个简单的数据框df
开始:
col1,col2
1,3
2,1
3,8
我想在列名的函数中应用布尔mask
。我知道价值观很容易:
mask = df <= 1
df = df[mask]
返回:
掩模:
col1 col2
0 True False
1 False True
2 False False
DF:
col1 col2
0 1 NaN
1 NaN 1
2 NaN NaN
正如所料。现在我想基于列名获得一个布尔掩码,如:
mask = df == df['col_1']
应返回:
掩模
col1 col2
0 True False
1 True False
2 True False
编辑:
这看起来很奇怪,但是我需要这些面具后来通过列seaborn heatmaps进行过滤。
答案 0 :(得分:6)
正如评论中所指出的那样,你需要获得像这样的“面具”的情况似乎很少见(很有可能,你不在其中一个)。因此,在Pandas中可能没有很好的“内置”解决方案。
尽管如此,你可以使用如下的黑客来实现你所需要的,例如:
mask = (df == df) & (df.columns == 'col_1')
<强>更新即可。如注释中所述,如果您的数据框包含空值,则以这种方式计算的掩码在相应位置始终为False
。如果这是一个问题,更安全的选项是:
mask = ((df == df) | df.isnull()) & (df.columns == 'col_1')
答案 1 :(得分:1)
您可以转置数据框,而不是将其与列进行比较,然后转置回来。有点奇怪,但工作的例子:
ftl/jbehave-reports.ftl
修改强>
我找到了另一个答案,你可以使用isin
方法:
import pandas as pd
from io import StringIO
data = """
col1,col2
1,3
2,1
3,8
"""
df = pd.read_csv(StringIO(data))
mask = (df.T == df['col1']).T
In [176]: df
Out[176]:
col1 col2
0 1 3
1 2 1
2 3 8
In [178]: mask
Out[178]:
col1 col2
0 True False
1 True False
2 True False
EDIT2
由于@DSM在评论中显示这两种情况无法正常工作。所以你应该使用@KT。方法。但是..让我们用转置玩更多:
In [41]: df.isin(df.col1)
Out[41]:
col1 col2
0 True False
1 True False
2 True False