当前位置: 首页 > 知识库问答 >
问题:

熊猫:索引数据帧时出现多个条件-意外行为

鲜于喜
2023-03-14

我过滤的数据框中的行的值在两个列。

出于某种原因,OR运算符的行为与我期望的和运算符的行为相同,反之亦然。

我的测试代码:

import pandas as pd

df = pd.DataFrame({'a': range(5), 'b': range(5) })

# let's insert some -1 values
df['a'][1] = -1
df['b'][1] = -1
df['a'][3] = -1
df['b'][4] = -1

df1 = df[(df.a != -1) & (df.b != -1)]
df2 = df[(df.a != -1) | (df.b != -1)]

print pd.concat([df, df1, df2], axis=1,
                keys = [ 'original df', 'using AND (&)', 'using OR (|)',])

结果是:

      original df      using AND (&)      using OR (|)    
             a  b              a   b             a   b
0            0  0              0   0             0   0
1           -1 -1            NaN NaN           NaN NaN
2            2  2              2   2             2   2
3           -1  3            NaN NaN            -1   3
4            4 -1            NaN NaN             4  -1

[5 rows x 6 columns]

如您所见,运算符会删除至少一个值等于-1的每一行。另一方面,运算符要求两个值都等于-1,才能删除它们。我预期的结果恰恰相反。有人能解释一下这种行为吗?

我用的是熊猫0.13.1。

共有3个答案

皇甫展
2023-03-14

这里有一点数学逻辑理论:

非a非b与非(a或b)相同,所以:

"a NOT-1 AND b NOT-1"相当于"NOT-(a is-1 or b is-1)",它与"(a is-1 or b is-1)"相反(补语)。

因此,如果您想要完全相反的结果,df1和df2应如下所示:

df1 = df[(df.a != -1) & (df.b != -1)]
df2 = df[(df.a == -1) | (df.b == -1)]
陆臻
2023-03-14

您还可以使用query(),即:

df_filtered = df.query('a == 4 & b != 2')
祁远
2023-03-14

如您所见,AND运算符会删除至少一个值等于-1的每一行。另一方面,OR运算符要求两个值都等于-1才能删除它们。

这是正确的。记住,你写的条件是你想保留什么,而不是你想放弃什么。对于df1

df1 = df[(df.a != -1) & (df.b != -1)]

您说的是保留df. a不是-1和df. b不是-1的行,这与删除至少有一个值为-1的行相同。

对于df2

df2 = df[(df.a != -1) | (df.b != -1)]

您的意思是“保留df.adf.b不是-1的行”,这与删除两个值都是-1的行相同。

注:像df['a'][1]=-1这样的链式访问会让你陷入麻烦。最好养成使用的习惯。loc。iloc

 类似资料:
  • 我想更改我的熊猫数据框架中的一个值,我想我误解了索引的工作方式。 我得到输出 我想将df中的值0.665873更改为1。我试过了 但我得到了错误 我试图用示例数据帧复制该问题,但无济于事。 我认为问题在于,当我使用实际数据时,我得到了一系列的输出,但当我使用实践数据时,得到了一个浮点。为什么我得到的是这个系列而不是浮点0.665873?

  • 我有一个csv文件列表,我使用 我目前正在尝试遍历csv列表,并使用方法将axis参数设置为1,以按列将所有数据帧添加到一起。 它是工作的希望,但我遇到的问题,因为所有的数据帧都有相同的冒号名称,当我连接他们我得到例如10列都与关键"日期" 不管怎样,我能给哥伦布起个独一无二的名字吗?比如伦敦约会,柏林约会?显然,这些名称基于数据帧的名称。

  • 问题内容: 我几乎在整个互联网上进行搜索,但对于我来说,这些方法似乎都不起作用。 我有两个大型的csv文件(每个文件都有一百万+行,大小约为300-400MB)。它们可以使用 read_csv 函数很好地加载到数据帧中,而不必使用 chunksize 参数。我什至对这些数据执行了一些次要的操作,例如新的列生成,过滤等。 但是,当我尝试合并这两个框架时,出现了 MemoryError 。我什至尝试使

  • 我有这种熊猫。数据框。“a”、“b”是获得“x”和“y”时的条件。 我需要绘制关于相同条件的(x,y)结肠的折线图。预期结果图为: 当然,这个图像是由以下代码手动给出的: 我的问题是,当获得一个包含条件列x和y的数据帧时,如何动态地绘制如上所述的图。 列名是固定的。但是,条件列的值是动态更改的。因此,我不能使用10、20、100、200的值。 如果我有下面的“用a和b过滤”方法,我认为问题解决了:

  • 我有一个多索引数据框,看起来像 uid tid文本 abc x t1 bcd y t2 uid 和 tid 是索引。我有一个 uid 列表,并希望获取与该列表中的 uid 相对应的行,但保留第 2 级索引值 (tid)。我想在不运行任何显式循环的情况下执行此操作。这可能吗?

  • 假设我有一个数据帧 我从我的数据子集创建另一个数据帧: 是否保存了中这些元素的副本?有没有办法创建该数据的?如果是这样,如果我尝试修改此视图中的数据会发生什么情况?Pandas是否提供任何类型的写时拷贝机制?