pandas - 按列名掩盖数据帧

时间:2015-12-03 11:32:18

标签: python pandas dataframe

从这个简单的数据框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进行过滤。

2 个答案:

答案 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