如何在Python中选择数据帧的某些行?
我有一个熊猫数据框,看起来像这样:如何在Python中选择数据帧的某些行?,python,pandas,Python,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
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
我想做的是根据条件选择某些行,并从中创建两个不同的数据帧(其中一个由满足条件的行组成,另一个由不满足条件的行组成)。条件是每行的x_cor
值是否大于前面和后面的x_cor
值
例如,第三行893.400024 41
满足条件,因为前一行的x_cor为17,下一行的x_cor为39,小于41
我认为如果我将循环与
iloc
或ix
一起使用,效率会很低。有什么更好的方法可以做到这一点呢?使用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
使用
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
从
scipy
argrelextrema
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
从
scipy
argrelextrema
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
哇,这是一个如此简单和仍然强大的工作方式!谢谢你的帮助@maynull使用Wen的解决方案,比mineWow快得多,这是一种如此简单且仍然强大的工作方式!谢谢你的帮助@可以使用温的解决方案,比mine@Wen谢谢你的帮助!您知道如何获取行不符合条件的数据帧吗?@maynull
df.iloc[~df.index.isin(argrelextrema(df.x_cor.values,np.morer)[0])
答案非常好。我已经投了赞成票(实际上两个都投了)@Wen非常感谢你!Scipy很棒!我也是:-(顺便说一句,我认为这是最好的;太多的人有问题打电话给我,我看到到处都是“COLDSPEED”,而不是“c”ᴏʟᴅsᴘᴇᴇᴅ 就像它应该是>:-(@Wen谢谢你的帮助!你知道如何得到一个数据帧,其中的行不符合条件吗?@maynulldf.iloc[~df.index.isin(argrelextrema(df.x_cor.values,np.greater)[0])
非常好的答案。我已经投票了(实际上都投票了)@Wen非常感谢你!Scipy很棒!我也是:-(顺便说一句,我认为这是最好的选择;太多人对我有意见,我看到到处都是“COLDSPEED”,而不是“c”ᴏʟᴅsᴘᴇᴇᴅ 就像它应该是>:-(