【问题标题】:Masking multiple columns on a pandas dataframe in python在python中屏蔽熊猫数据框上的多列
【发布时间】:2014-08-11 07:02:03
【问题描述】:

我希望在 python 中对 pandas 数据集的每一列(分别针对其属性)应用 multiply mask。 在下一步中,我想在适合所有条件的数据框中找到(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,以便我 选择行,其中所有 布尔标准都匹配 (是真的)?

【问题讨论】:

  • 什么是预期的输出,你的行都不是真值,只有 'IA' 作为一列有所有真值
  • @EdChum 感谢您的评论。我添加了预期的结果

标签: python pandas multiple-columns dataframe mask


【解决方案1】:

您可以使用 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

编辑:只是为了解决 cmets 澄清后的原始问题,我们希望不同列的过滤标准不同

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

【讨论】:

  • 感谢您的帮助。我想做: index = s_mask.all(axis=1) select = df.ix[index] out: Out[21]: a b 1 -3 5 。您可以将其插入答案吗?然后我会将其标记为已回答:)
  • 不确定我是否理解,如果我执行上述操作,我会得到一个空数据框,因为两行的索引都是 False,在我的示例中,您的 s_mask 是否指的是 msk?所以我不确定你在评论中的表现如何[21]?
  • 哦,是的,我跳到了那里。我申请了:msk1 = df[[0]]3 s_mask = pandas.concat((msk1, msk2), axis=1)
  • 嘿@Antihead 让我知道最后一次编辑是否解决了您的问题
  • 组合掩码的一般注意事项:最初对我来说并不明显的是,由于优先规则,使用运算符 &amp;| 组合掩码需要将各个关系表达式加上括号,因为优先级规则,否则你要么得到错误,要么得到更糟糕的误导,疯狂的按位运算结果,因为 &amp;| 比关系运算具有更高的优先级! (参考:docs.python.org/3/reference/…
【解决方案2】:
df[df[['DE', 'GA', 'ID']].all(axis=1) * (1 - df[['FL', 'IA']]).all(axis=1)]

这里的难点在于了解为什么要使用偶数/奇数列位置来确定处理方式。根据您的代码,您似乎希望第 0、2 和 4 列实际上是 1 减去它们的当前值。但是,根据您声称的预期输出,您实际上似乎希望第 1 列和第 3 列的 1 减去它们的当前值。

我上面的代码反映了后一种假设。总体思路仍然有效;只需调整它以反映您实际需要的任何列,减去 1 的值,假设您对所需的输出进行更严格的定义。

可能需要先清理并转换为适当的辅助函数,明确显示哪些列需要用 1 减去它们的值,而哪些列可以不理会。​​p>

【讨论】:

  • 感谢您的回答。在正确的代码中,我实际上迭代抛出所有列并应用各种不同的条件来屏蔽每一列。这就是代码要表达的全部内容。我实际上想提取原始 df 数据帧的数据....
  • 我提供的方法确实根据需要从原始 DataFrame 中提取数据。
猜你喜欢
  • 2018-04-27
  • 1970-01-01
  • 1970-01-01
  • 2021-05-27
  • 1970-01-01
  • 2019-09-29
  • 2016-07-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多