Pandas数据帧:检查数据是否单调递减

Ann*_*nne 11 python pandas

我有一个像这样的pandas数据帧:

    Balance       Jan       Feb       Mar       Apr
0  9.724135  0.389376  0.464451  0.229964  0.691504
1  1.114782  0.838406  0.679096  0.185135  0.143883
2  7.613946  0.960876  0.220274  0.788265  0.606402
3  0.144517  0.800086  0.287874  0.223539  0.206002
4  1.332838  0.430812  0.939402  0.045262  0.388466
Run Code Online (Sandbox Code Playgroud)

我想通过弄清楚从1月到4月的值是否单调递减(如在1和3行中的索引)来划分行,然后将每个组的余额相加,即最后我想要结束两个数字(减少时间序列为1.259299,其他数字为18.670919).

我想如果我可以添加一个"正在减少"的列中包含布尔值,我可以使用pandas的groupby来完成总和,但是我该如何创建这个列呢?

谢谢,安妮

And*_*den 10

您可以使用is_monotonicalgos中的一个函数:

In [10]: months = ['Jan', 'Feb', 'Mar', 'Apr']

In [11]: df.loc[:, months].apply(lambda x: pd.algos.is_monotonic_float64(-x)[0],
                                       axis=1)
Out[11]:
0    False
1     True
2    False
3     True
4    False
dtype: bool
Run Code Online (Sandbox Code Playgroud)

is_monotonic检查是否阵列它减小因此-x.values.

(这似乎比Tom的解决方案快得多,即使使用提供的小型DataFrame也是如此.)

  • @TomAugspurger我认为你要找的词是"pandastic"......\*ahem\*. (2认同)

Tom*_*ger 7

months = ['Jan', 'Feb', 'Mar', 'Apr']
Run Code Online (Sandbox Code Playgroud)

转置,以便我们可以使用该diff方法(不采用轴参数).我们用0填充第一行(1月)NaN.否则就是.

In [77]: df[months].T.diff().fillna(0) <= 0
Out[77]: 
         0     1      2     3      4
Jan   True  True   True  True   True
Feb  False  True   True  True  False
Mar   True  True  False  True   True
Apr  False  True   True  True  False
Run Code Online (Sandbox Code Playgroud)

要检查它是否单调递减,请使用.all()方法.默认情况下,它超过了轴0,即行(月).

In [78]: is_decreasing = (df[months].T.diff().fillna(0) <= 0).all()

In [79]: is_decreasing
Out[79]: 
0    False
1     True
2    False
3     True
4    False
dtype: bool

In [80]: df['is_decreasing'] = is_decreasing

In [81]: df
Out[81]: 
    Balance       Jan       Feb       Mar       Apr is_decreasing
0  9.724135  0.389376  0.464451  0.229964  0.691504         False
1  1.114782  0.838406  0.679096  0.185135  0.143883          True
2  7.613946  0.960876  0.220274  0.788265  0.606402         False
3  0.144517  0.800086  0.287874  0.223539  0.206002          True
4  1.332838  0.430812  0.939402  0.045262  0.388466         False
Run Code Online (Sandbox Code Playgroud)

就像你建议的那样,我们可以分组is_decreasing和总结:

In [83]: df.groupby('is_decreasing')['Balance'].sum()
Out[83]: 
is_decreasing
False            18.670919
True              1.259299
Name: Balance, dtype: float64
Run Code Online (Sandbox Code Playgroud)

我爱大熊猫的时候就是这样的.