【问题标题】:pandas loc behaves differently with row filterpandas loc 与行过滤器的行为不同
【发布时间】:2021-03-08 23:25:16
【问题描述】:

Pandas loc 方法与行过滤器一起使用时会引发错误

test[test.loc[0:1,['holiday','weekday']].apply(lambda x:True,axis=1)]

IndexingError:作为索引器提供的不可对齐布尔系列(索引 布尔系列和索引对象的不匹配)。

而没有行过滤器的相同代码可以正常工作

test[test.loc[0:1,['holiday','weekday']].apply(lambda x:True,axis=1)]

复制步骤

test=pd.DataFrame({"holiday":[0,0,0],"weekday":[1,2,3],"workingday":[1,1,1]})
test[test.loc[:,['holiday','weekday']].apply(lambda x:True,axis=1)] ##works fine
test[test.loc[0:1,['holiday','weekday']].apply(lambda x:True,axis=1)] ##fails

我试图了解这两者之间的区别是什么导致一个失败而另一个成功

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    所以基本语法是DataFrame[things to look for, e.g row slices or columns] 考虑到这一点,您正在尝试使用以下命令过滤您的数据框test(这些是括号中的代码 sn-ps):

    test.loc[:,['holiday','weekday']].apply(lambda x:True,axis=1)

    这会为数据帧中的每一行返回True,因此“过滤器”会返回整个数据帧

    test.loc[0:1,['holiday','weekday']].apply(lambda x:True,axis=1)

    这部分本身正在工作,它是通过对第 0 行和第 1 行进行切片然后应用 lambda 函数来实现的。因此,“过滤器”仅包含 2 行中的 True。现在的重点是,第三行没有值,这会导致您的错误:必须切片的数据帧的索引(3 行)和用于切片的布尔系列(2 个值)不匹配.

    解决此问题取决于您实际想要的输出,即 lambda 函数是否应该仅应用于数据的子集,或者您是否只希望检索结果的子集使用。

    【讨论】:

    • 谢谢 Ben,我正在尝试根据条件对数据子集应用函数。我希望test.loc[0:1,['holiday','weekday']] 会给出一个新的 df 子集,我可以应用它。您能否更清楚地说明我们如何实现它。
    • test.loc[0:1,['holiday','weekday']] 完全符合您的预期:它获取数据的一个子集,然后在下一步中将应用函数应用于该子集。您的代码的问题是您使用了应用于数据子集的此函数的结果来切片整个数据帧(通过外部test[...]),而这里两者的长度不匹配。不妨试试以下方法:test['result'] = test.loc[0:1,['holiday','weekday']].apply(lambda x:True,axis=1),然后查看test 看看会发生什么,以及这是否是您真正想要的。
    猜你喜欢
    • 1970-01-01
    • 2020-08-13
    • 2020-11-29
    • 2018-12-06
    • 2019-03-01
    • 2021-08-12
    • 2018-01-29
    • 1970-01-01
    • 2021-08-29
    相关资源
    最近更新 更多