5

我正在尝试where在我的 Pandas DataFrame 上使用将所有不符合我的标准的单元格替换为NaN. 但是,我希望以始终保留原始 DataFrame 的形状,并且不会从生成的 DataFrame 中删除任何行的方式来执行此操作。

给定以下数据框:

      A    B    C    D
1/1   0    1    0    1
1/2   2    1    1    1
1/3   3    0    1    0 
1/4   1    0    1    2
1/5   1    0    1    1
1/6   2    0    2    1
1/7   3    5    2    3

D当列ALSO 满足特定条件时,我想在数据框中搜索满足特定条件的所有单元格。在这种情况下,我的标准是:

当列 D 也 > 1 时,查找所有大于前一个值的单元格

我通过使用以下语法来完成此操作:

matches = df[df > df.shift(1))]
matches = matches[df.D > 1]

我必须将此查询拆分为两个语句,因为它df.D是一个系列并且与整个 DataFrame 的形状不匹配。根据我之前提出的这个问题&,对广播运营商的支持要到 0.14 才可用。

我遇到的问题是,在我运行第二条语句之后,结果数据框的形状发生了变化,并且行已被删除。列数保持不变。第一条语句保留原始行数。

为什么第二个语句会删除行而第一个语句不会?我怎样才能获得相同的结果,但保留完整的行数?

编辑:

熊猫文档指出,为了保证形状被保留,我应该使用where布尔索引的方法。但是,这似乎不允许执行我的第二个语句,所以:

matches.where(df.D > 1)

给我以下错误:

ValueError:条件数组必须与自身的形状相同

4

2 回答 2

6

这比@DSM 答案更直观(但熊猫在布尔操作 ATM 上缺少这种类型的自动广播)

In [58]: df.where((df>df.shift(1)).values & DataFrame(df.D==1).values)
Out[58]: 
      A   B   C   D
1/1 NaN NaN NaN NaN
1/2   2 NaN   1 NaN
1/3 NaN NaN NaN NaN
1/4 NaN NaN NaN NaN
1/5 NaN NaN NaN NaN
1/6   2 NaN   2 NaN
1/7 NaN NaN NaN NaN

请参阅此处了解要在 0.14 中解决的问题

于 2013-10-22T11:42:08.470 回答
3

如果我了解您的需求,您可以通过下拉到以下numpy级别手动进行广播:

>>> (df > df.shift(1)).values & (df.D == 1)[:,None]
array([[False, False, False, False],
       [ True, False,  True, False],
       [False, False, False, False],
       [False, False, False, False],
       [False, False, False, False],
       [ True, False,  True, False],
       [False, False, False, False]], dtype=bool)

之后您可以使用where

>>> df.where((df > df.shift(1)).values & (df.D == 1)[:,None], np.nan)
      A   B   C   D
1/1 NaN NaN NaN NaN
1/2   2 NaN   1 NaN
1/3 NaN NaN NaN NaN
1/4 NaN NaN NaN NaN
1/5 NaN NaN NaN NaN
1/6   2 NaN   2 NaN
1/7 NaN NaN NaN NaN
于 2013-10-22T01:09:57.127 回答