在python中屏蔽pandas数据帧上的多个列

时间:2014-06-20 13:39:32

标签: python pandas multiple-columns dataframe mask

我希望在python中对 pandas数据集的每一列(分别对它的属性)应用乘法掩码。 在下一步中,我想适合所有条件的数据框中找到(a)行。 因此我有

df
Out[27]: 
   DE  FL  GA  IA  ID 
0   0   1   0   0   0 
1   1   0   1   0   1  
2   0   0   1   0   0 
3   0   1   0   0   0
4   0   0   0   0   0 

mask_list = []
for i in range(0,5):

    if i % 2==0:
        mask_list.append(df[[i]]>0)
    else:
        mask_list.append(df[[i]]<1)

concat_frame = pa.DataFrame()
for mask in mask_list:
    concat_frame =pa.concat((concat_frame, mask), axis=1)

concat_frame
Out[48]: 
      DE     FL     GA    IA     ID
0  False   False False  True  False
1  True    True  True   True  True
2  False   True  True   True  False
3  False   False False  True  False
4  False   True  False  True  False

[5 rows x 5 columns]


更新 预期结果:

outcome
Out[60]:
   DE   FL  GA  IA  ID
1   1   0   1   0   1 

出现问题
如何在 df 上应用 concat_mask ,以便我选择行,其中所有布尔条件都匹配 (是真的)?

2 个答案:

答案 0 :(得分:8)

您可以使用pandas all方法和布尔逻辑。正如EdChum评论的那样,我对你的确切例子还有点不清楚,但类似的例子是

In [1]: df = DataFrame([[1,2],[-3,5]], index=[0,1], columns=['a','b'])
In [2]: df
Out [2]:
   a  b
0  1  2
1 -3  5

In [3]: msk = (df>1) & (df<5)
In [4]: msk
Out [4]:
      a    b
0 False  True
1 False False

In [5]: msk.all(axis=1)
Out [5]:
0  False
1  False
dtype: bool

如果您想通过掩码索引原始数据框

In [6]: df[msk]
Out [6]:
     a   b
0  NaN   2
1  NaN NaN

或者您最初指出所有行都为真的行

In [7]: idx = msk.all(axis=1)
In [8]: df[idx]
Out [8]:
Empty DataFrame
Columns: [a,b]
Index: []

或者如果一行是真的

In [9]: idx[0] = True
In [10]: df[idx]
Out [10]:
  a b
0 1 2

编辑:只是在评论澄清之后解决原始问题,我们希望不同列的不同过滤条件

In [10]: msk1 = df[['a']] < 0
In [11]: msk2 = df[['b']] > 3
In [12]: msk = concat((msk1, msk2), axis=1)
In [12]: slct = msk.all(axis=1)
In [13]: df.ix[slct]
Out [13]:
   a b
1 -3 5

答案 1 :(得分:0)

df[df[['DE', 'GA', 'ID']].all(axis=1) * (1 - df[['FL', 'IA']]).all(axis=1)]

这里的难点在于理解为什么你使用偶数/奇数列位置来确定治疗方法。根据您的代码,看起来您希望第0列,第2列和第4列实际上为1减去其当前值。但是,根据您声称的预期输出,实际上您希望第1列和第3列的1减去其当前值。

上面的代码反映了后一种假设。一般的想法仍然有效;只需调整它以反映实际需要的列减去1的值,假设您更严格地定义了所需的输出。

可能首先需要清理并转换为正确的辅助函数,明确显示哪些列需要减去1的值,而不是哪些列可以保留。