【问题标题】:How to select certain rows of a dataframe in Python?如何在 Python 中选择数据框的某些行?
【发布时间】:2018-05-18 23:31:22
【问题描述】:

我有一个看起来像这样的 pandas 数据框:

              x_cor
y_cor             
893.200012       1
893.299988      17
893.400024      41
893.500000      39
893.599976      40
893.700012      36
893.799988       2
893.900024      13
894.000000      44
894.099976      43
894.200012      74
894.299988      88
894.400024      78
894.500000     132
894.599976     180
894.700012     178

我想要做的是根据条件选择某些行,并从中创建2个不同的数据框(其中一个由满足条件的行组成,另一个由行组成不符合条件的)。条件是每一行的x_cor 值是否大于前面和后面的x_cor 值。

例如第3行893.400024 41满足条件,因为上一行的x_cor为17,下一行的x_cor为39,小于41。

我认为如果我使用带有ilocix 的循环会效率低下。有什么更好的方法来做到这一点?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    来自scipyargrelextrema

    from scipy.signal import argrelextrema
    df.iloc[argrelextrema(df.x_cor.values, np.greater)]
    Out[981]: 
                x_cor
    y_cor            
    893.400024     41
    893.599976     40
    894.000000     44
    894.299988     88
    894.599976    180
    

    【讨论】:

    • @Wen 谢谢你的帮助!您是否碰巧知道如何获取不满足条件的行的数据框?
    • @maynull df.iloc[~df.index.isin(argrelextrema(df.x_cor.values, np.greater)[0])]
    • 很棒的答案。我已经投了赞成票(实际上两者都赞成)
    • @Wen 非常感谢! Scipy 很棒!
    • 我也是 :-( 顺便说一句,决定这是最好的;太多人在 ping 我时遇到问题,我到处都看到 \@COLDSPEED 而不是 \@cᴏʟᴅsᴘᴇᴇᴅ 应该是 >:- (
    【解决方案2】:

    使用shift

    df.loc[(df.x_cor > df.x_cor.shift(1)) & (df.x_cor > df.x_cor.shift(-1))]
    
             y_cor  x_cor
    2   893.400024     41
    4   893.599976     40
    8   894.000000     44
    11  894.299988     88
    14  894.599976    180
    

    【讨论】:

    • 哇,这是一种如此简单且功能强大的工作方式!感谢您的帮助!
    • @maynull 用温的方案,比我的快很多
    猜你喜欢
    • 2018-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-01
    • 1970-01-01
    • 2019-12-17
    相关资源
    最近更新 更多