【问题标题】:Python Pandas check if a value occurs more then once in the same dayPython Pandas 检查一个值是否在同一天出现多次
【发布时间】:2013-11-17 05:27:17
【问题描述】:

我有一个如下所示的 Pandas 数据框。我要做的是检查一个站是否在同一天有变量yyy 和任何其他变量(如station1 的情况)。如果这是真的,我需要删除包含yyy 的整行。

目前我正在使用iterrows() 执行此操作并循环搜索此变量出现的日期,将变量更改为“删除我”之类的内容,从中构建一个新数据框(因为pandas doesn't support replacing in place)并过滤新的数据框以摆脱不需要的行。这现在可行,因为我的数据框很小,但不太可能扩展。

问题:这似乎是一种非常“非熊猫”的方式来做到这一点,是否有其他方法可以删除不需要的变量?

                dateuse         station         variable1
0   2012-08-12 00:00:00        station1               xxx
1   2012-08-12 00:00:00        station1               yyy
2   2012-08-23 00:00:00        station2               aaa
3   2012-08-23 00:00:00        station3               bbb
4   2012-08-25 00:00:00        station4               ccc
5   2012-08-25 00:00:00        station4               ccc
6   2012-08-25 00:00:00        station4               ccc

【问题讨论】:

    标签: python python-2.7 pandas


    【解决方案1】:

    我可能会使用布尔数组进行索引。我们想删除包含yyy 和多个dateuse/station 组合的行(如果我明白你在做什么!)。

    我们可以使用transform将每个dateuse/station组合的大小广播到数据帧的长度,然后分组选择长度> 1的行。然后我们可以&这与yyys 所在的位置有关。

    >>> multiple = df.groupby(["dateuse", "station"])["variable1"].transform(len) > 1
    >>> must_be_isolated = df["variable1"] == "yyy"
    >>> df[~(multiple & must_be_isolated)]
                   dateuse   station variable1
    0  2012-08-12 00:00:00  station1       xxx
    2  2012-08-23 00:00:00  station2       aaa
    3  2012-08-23 00:00:00  station3       bbb
    4  2012-08-25 00:00:00  station4       ccc
    5  2012-08-25 00:00:00  station4       ccc
    6  2012-08-25 00:00:00  station4       ccc
    

    【讨论】:

    • 这行得通,但我很确定为什么...尤其是df[~(multiple & must_be_isolated)] 做什么?
    • print multiple 将显示它是一个布尔数组,只要该行是长度为> 1(dateuse, station) 组的成员,它就是Truemust_be_isolated 只是一个数组,无论何时 variable1 == 'yyy' 都是 True。 multiple & must_be_isolated 是一个布尔数组,它是 True,只要我们想独处(这里是 yyy),它在一个有多个成员的组中。这些是我们要删除的行。 ~(mul.. & must_..) 是我们想要保留的行的否定。 df[some_boolean_array_here] 选择这些行。这有意义吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-06
    • 1970-01-01
    • 2022-07-18
    • 2017-11-12
    • 1970-01-01
    相关资源
    最近更新 更多