【问题标题】:Check if all column values in current row is lesser than all previous rows in pandas dataframe检查当前行中的所有列值是否小于熊猫数据框中的所有先前行
【发布时间】:2017-06-15 14:42:35
【问题描述】:

有没有办法检查当前行中的所有列值是否小于 pandas 数据帧(整个数据帧)中所有先前行(直到当前行)中的相应列值,并创建一个新列相应的值是 1 还是 0?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    考虑数据框df

    np.random.seed(1)
    df = pd.DataFrame(np.random.rand(10, 2), columns=list('AB'))
    
    df
    
              A         B
    0  0.417022  0.720324
    1  0.000114  0.302333
    2  0.146756  0.092339
    3  0.186260  0.345561
    4  0.396767  0.538817
    5  0.419195  0.685220
    6  0.204452  0.878117
    7  0.027388  0.670468
    8  0.417305  0.558690
    9  0.140387  0.198101
    

    选项 1
    cumminshift
    这里的概念是跟踪到目前为止每列的最小值。如果特定行上的值小于前一行及其之前的所有行,则它必须是新的最小值。我们可以通过检查它是否小于前一行的最小值来判断这是否是True
    注意这应该可以很好地处理NaN 值。

    df.assign(New=(df < df.cummin().shift()).all(1).astype(int))
    
              A         B  New
    0  0.417022  0.720324    0
    1  0.000114  0.302333    1
    2  0.146756  0.092339    0
    3  0.186260  0.345561    0
    4  0.396767  0.538817    0
    5  0.419195  0.685220    0
    6  0.204452  0.878117    0
    7  0.027388  0.670468    0
    8  0.417305  0.558690    0
    9  0.140387  0.198101    0
    

    选项 2
    numpy 版本
    numpy.minimum

    v = df.values
    c = np.minimum.accumulate(v[:-1], axis=0)
    df.assign(New=np.append(False, (v[1:] < c).all(1)).astype(int))
    
              A         B  New
    0  0.417022  0.720324    0
    1  0.000114  0.302333    1
    2  0.146756  0.092339    0
    3  0.186260  0.345561    0
    4  0.396767  0.538817    0
    5  0.419195  0.685220    0
    6  0.204452  0.878117    0
    7  0.027388  0.670468    0
    8  0.417305  0.558690    0
    9  0.140387  0.198101    0
    

    【讨论】:

    • @MukarramPasha 也许可以,但我还没有想到办法。在这个问题中,我关心我的当前行相对于它之前的每一行。我不关心相对于它之前的每一行的前一行。到目前为止,与累积最小值进行比较似乎是最好的方法。
    • 哦,我明白了,谢谢。 *抱歉,我错误地删除了我的第一条评论。
    • @MukarramPasha 如果你喜欢或欣赏这个答案,我们回答喜欢投票......只是说'
    • 已经点赞的人 ;) 想知道如果我们能看到哪个用户点赞了该有多酷
    • @MukarramPasha 我看到了 :-) 你赞成评论。也可以随意对答案进行投票……但前提是您认为它有用。
    【解决方案2】:

    使用@piRsuared 的 DF:

    np.random.seed(1)
    df = pd.DataFrame(np.random.rand(10, 2), columns=list('AB'))
    Out[31]: 
              A         B
    0  0.417022  0.720324
    1  0.000114  0.302333
    2  0.146756  0.092339
    3  0.186260  0.345561
    4  0.396767  0.538817
    5  0.419195  0.685220
    6  0.204452  0.878117
    7  0.027388  0.670468
    8  0.417305  0.558690
    9  0.140387  0.198101
    

    您可以使用 apply 将当前行与所有先前行的最大值进行比较,然后将结果转换为 int。

    df.apply(lambda x: (x<df[0:x.name].max()).all().astype(int),axis=1)
    Out[30]: 
    0    0
    1    1
    2    1
    3    1
    4    1
    5    0
    6    0
    7    1
    8    1
    9    1
    dtype: int64
    

    【讨论】:

    • 我想将 min() 逻辑应用到上面的命令中,并且效果很好。但是让我们说我有一个 5 行和 5 列的数据框。如果第一行的第二列和第三列是Nan,那么对于第三行,这个逻辑是行不通的。 (如果上一行有 Nan),对于下一行,逻辑不工作!我该如何处理?
    • 任何人都知道如何使逻辑在我的情况下工作。如果在我的前一行中,其中一列是 Nan,则应忽略它,并且必须将所有其他列与前一行进行比较。任何帮助将不胜感激
    猜你喜欢
    • 2020-03-18
    • 1970-01-01
    • 2017-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多