Pandas 熊猫:如何比较列的值和下一个值

Pandas 熊猫:如何比较列的值和下一个值,pandas,Pandas,我有一个如下所示的数据框: colA colB 0 A 10 1 B 20 2 C 5 3 D 2 4 F 30 .... 我想比较第1列的值以检测两个连续递减。也就是说,我想报告索引值,其中第1列有两个连续递减。例如,我想报告“B”,因为B后面有两个连续的行,其中列1的值递减。我不知道如何在不编写循环的情况下实现这一点。(如果无法避免循环,我想知道。) 谢谢您可以使用loc: desired=frame.loc[(fr

我有一个如下所示的数据框:

  colA  colB
0    A    10
1    B    20
2    C     5
3    D     2
4    F    30
  ....
我想比较第1列的值以检测两个连续递减。也就是说,我想报告索引值,其中第1列有两个连续递减。例如,我想报告“B”,因为B后面有两个连续的行,其中列1的值递减。我不知道如何在不编写循环的情况下实现这一点。(如果无法避免循环,我想知道。)


谢谢

您可以使用loc:

desired=frame.loc[(frame["colB"]>=frame["colB"].shift(-1)) &
          (frame["colB"].shift(-1)>=frame["colB"].shift(-2) )]
print(desired)
输出将是:

   colA colB
1   B   20
['B']
如果您只希望报告值B:

desired=frame["colA"].loc[(frame["colB"]>=frame["colB"].shift(-1)) &
          (frame["colB"].shift(-1)>=frame["colB"].shift(-2) )]
print(desired.values)
输出将是:

   colA colB
1   B   20
['B']

是的,您可以在不使用循环的情况下执行此操作

df = pd.DataFrame({'colA':['A', 'B', 'C', 'D', 'F'], 'colB':[10, 20, 5, 2, 30]})
>>> df['colC'] = df['colB'].diff(-1)
>>> df
  colA  colB  colC
0    A    10 -10.0
1    B    20  15.0
2    C     5   3.0
3    D     2 -28.0
4    F    30   NaN
“colC”是连续行之间的差值

>>> df['colD'] = np.where(df['colC'] > 0, 1, 0)
>>> df
  colA  colB  colC  colD
0    A    10 -10.0     0
1    B    20  15.0     1
2    C     5   3.0     1
3    D     2 -28.0     0
4    F    30  -1.0     0
在“colD”中,我们标记差异大于0的标志

>>> df1['s'] = df1['colD'].shift(-1)
>>> df1
  colA  colB  colC  colD    s 
0    A    10 -10.0     0  1.0 
1    B    20  15.0     1  1.0 
2    C     5   3.0     1  0.0 
3    D     2 -28.0     0  0.0 
4    F    30  -1.0     0  NaN 
在“s”列中,我们移动“colD”的值

>>> df1['flag'] = np.where((df1['colD'] == 1) & (df1['colD'] == df1['s']), 1, 0)
>>> df1
  colA  colB  colC  colD    s  flag
0    A    10 -10.0     0  1.0     0
1    B    20  15.0     1  1.0     1
2    C     5   3.0     1  0.0     0
3    D     2 -28.0     0  0.0     0
4    F    30  -1.0     0  NaN     0

然后“flag”列是必需的。

这里需要一点逻辑

s=df.colB.diff().gt(0) # get the diff 
df.loc[df.groupby(s.cumsum()).colA.transform('count').ge(3)&s,'colA'] # then we using count to see which one is more than 3 items (include the line start to two items decreasing )
Out[45]: 
1    B
Name: colA, dtype: object

优雅的谢谢。你能解释一下shift在那里做什么吗?shift会将序列向上或向下“移位”n-所以
shift(-1)
会为每一行给出一个值。这是对所提问题的概括。好消息。谢谢