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

时间:2013-07-17 15:46:41

标签: 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

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

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

谢谢, 安

4 个答案:

答案 0 :(得分:9)

您可以使用algos中的is_monotonic函数之一:

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

is_monotonic检查数组是否减少因此-x.values

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

答案 1 :(得分:6)

months = ['Jan', 'Feb', 'Mar', 'Apr']

转置,以便我们可以使用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

要检查它是否单调递减,请使用.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

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

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

当我爱大熊猫时,它就像这些。

答案 2 :(得分:0)

months = ['Jan', 'Feb', 'Mar', 'Apr']

df[df.loc[:, months].apply(lambda x: x.is_monotonic,axis=1)]

注意:pandas 声明 is_monotonic_increasingis_monotonic 的别名,因此您可以使用任何一个

答案 3 :(得分:-1)

Pandas 0.19 添加了公开Series.is_monotonic API(如上所述,algos模块未记录,无法保证保留。)。

还有is_monotonic_increasingis_monotonic_decreasing。所有3都是非严格的(即is_monotonic_decreasing检查序列是否正在减少相等),但如果您需要严格,则可以将它们与is_unqiue结合使用。

my_df = pd.DataFrame({'A':[1,2,3],'B':[1,1,1],'C':[3,2,1]})
my_df
Out[32]: 
   A  B  C
0  1  1  3
1  2  1  2
2  3  1  1

my_df.apply(lambda x: x.is_monotonic)
Out[33]: 
A     True
B     True
C    False
dtype: bool