【问题标题】:Pandas series messing up with booleans熊猫系列弄乱了布尔值
【发布时间】:2016-01-15 07:47:41
【问题描述】:

我有这个 python 代码,它使用一个名为 data 的数据框,有两列/系列标记为“Id”和“Open”,用整数和布尔值填充。 但是下面的代码

print(data['Id'][0])
print(data['Id'][1])
print(data['Open'][0])
print(data['Open'][1]) 
print(data['Id'][0]!=0)
print(data['Id'][1]!=0)
print(data['Open'][0]!=0)
print(data['Open'][1]!=0) 

给我输出:

0    0
0    1
Name: Id, dtype: int64
1    0
1    2
Name: Id, dtype: int64
0    1
0    1
Name: Open, dtype: float64
1    1
1    1
Name: Open, dtype: float64
0    False
0     True
Name: Id, dtype: bool
1    False
1     True
Name: Id, dtype: bool
0    True
0    True
Name: Open, dtype: bool
1    True
1    True
Name: Open, dtype: bool

鉴于http://pandas.pydata.org/pandas-docs/stable/dsintro.html 将列描述为系列,我应该能够使用 data['Id'][0] 并读取一个 int 并将其与零进行比较的结果。
但是我改为在索引下阅读这些愚蠢的数字,而我很肯定我的 df 中没有元组(我从两个仅包含整数或 0/1 的 csv 解析它)。 那么我的错误在哪里?我也试过 iloc 和 loc ,但结果是一样的。 那么我从 pandas 文档中误解了什么?

辅助问题:我打印了那个,因为我的布尔索引有问题,因为我想用 data=data[data[id]>0 & data['open']==1] 选择我的数据,但是它一直在失败。我之前尝试过使布尔值 列表推导

booleanopen=[True if i==1 else False for i in data['Id']] 
booleanId=[True if i>01 else False for i in data['Id']] 
booleanand=booleanopen&booleanId
data=data[booleanand]

但它不断崩溃,没有回溯或错误消息。计算机只是卡住了几个小时。 (我想我不能改用:

booleanopen=[true for i==1 in data['Id']] 

因为它会给出一个充满真值的数组,长度等于1的个数,与前一个相反)

【问题讨论】:

    标签: python pandas boolean series


    【解决方案1】:

    我应该能够使用 data['Id'][0] 并读取 int

    data["Id"][0] 表示“获取名为 Id 的列,并访问与索引 0 关联的数据部分”。如果您有多个具有相同索引的行,pandas 将返回它们。例如:

    >>> df = pd.DataFrame({"Id": pd.Series([10,20,30], index=[0,0,1])})
    >>> df["Id"][0]
    0    10
    0    20
    Name: Id, dtype: int64
    >>> df["Id"][1]
    30
    

    虽然您出于某种原因没有显示您的框架,但我很确定这就是正在发生的事情。您必须研究它是如何构建的以找出原因(如果索引当前不包含任何信息,您总是可以使用df = df.reset_index(drop=True) 返回到“正常”索引。)

    至于单独的问题,“但它一直失败”作为错误报告并没有多大用处,但可能您只是没有像文档所示的那样使用括号:

    >>> df["Open"] = [1,2,1]
    >>> df[(df["Id"] > 20) & (df["Open"] == 1)]
       Id  Open
    1  30     1
    >>> df.loc[(df["Id"] > 20) & (df["Open"] == 1)]
       Id  Open
    1  30     1
    

    【讨论】:

    • 一直失败意味着布尔评估不正确,抱歉。至于索引,我不太确定发生了什么,因为每一列都来自不同的预处理来源。但我会在那个层面进行调查。问题是,虽然 pandas 旨在简单,但索引管理非常混乱,因此有些事情似乎突然发生。在明确指定类型的同时,我也遇到了各种各样的问题-_-。不管怎么说,还是要谢谢你。我猜有很多调试和追溯要做。
    • 我进行了更多调查,将文件写为 csv。但它似乎每列只有一个字段。实际上我认为这是这里作为元组呈现的索引。如果我也使用列表理解,我是否必须在您的第二个答案中使用括号来包含布尔评估?
    • @AndoJurai:此时您需要提供minimal reproducible example;我们中的任何一个都没有显示出看起来像元组的东西。
    • 好吧,当我将索引值更改为 10 和 21 时,我的输出如下; 10 0 10 1 名称:Id,dtype:int64 21 0 21 22 名称:Id,dtype:int64。所以我突然想到它是一个带有索引号的元组。它实际上比这更愚蠢;我连接到 df 并且他们的索引被混淆了。骗我!
    猜你喜欢
    • 2015-10-10
    • 2016-05-18
    • 2019-01-14
    • 1970-01-01
    • 1970-01-01
    • 2018-06-30
    • 1970-01-01
    • 2022-06-27
    • 1970-01-01
    相关资源
    最近更新 更多