Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 数据帧:检查数据是否单调递减_Python_Pandas - Fatal编程技术网

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

Python 数据帧:检查数据是否单调递减,python,pandas,Python,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.2878

我有这样一个熊猫数据框:

    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)

我想如果我可以添加一个包含布尔值的列“is Desculating”,我可以使用pandas的groupby进行求和,但是我该如何创建这个列呢

谢谢, 安妮

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

我喜欢熊猫的时候就是这样。

你可以使用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
是单调的
检查数组是否因此而减少
-x.values


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

Pandas 0.19添加了一个属性(如前所述,
algos
模块已从Pandas公共API中删除)

正如@Liam在他的回答中指出的,
是单调的
实际上是
是单调的
的别名,因此为了清楚起见,我建议直接使用
是单调的
还是
是单调的

无论如何,两者都是非严格的(即当序列递减相等时,
是单调递减的
返回
),但如果需要严格,可以将它们结合起来

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_increasing)  # row-wise monotonic (default axis is 0)

Out[33]: 
A     True
B     True
C    False
dtype: bool

my_df.apply(lambda x: x.is_monotonic_increasing, axis=1)  # column-wise monotonic

Out[34]: 
0     True
1    False
2    False
dtype: bool

注:pandas表示,
is_monotonic\u increating
is_monotonic
的别名,因此您可以使用其中一个

您是否考虑每个月使用一列布尔值?您可以在不同的行中从减少切换到增加。啊,不用担心。你的意思是逐月递减。我想你要找的词是“pandastic”*谢谢,安迪,这个很好用。我有一个愚蠢的问题——我一直在寻找关于is_单调函数的文档,但我似乎在网上找不到任何文档。你有链接吗?另一个问题-我不能在
df.loc[:,months]中写
-x
而不是
-x.values
。应用(lambda x:pd.algos.is_monotonic_float64(-x.values)[0],axis=1)
?我试过了,似乎很管用。@Anne显然是这样的!:)@Anne-pandas的较新版本从公共API中删除了
pd.algos
模块<代码>是单调的
现在可以作为一个系列属性使用(参见我的答案)。问题是针对行,而不是系列/列。为使其有效(即检查AThanks@Liam是否正确),我已相应地更新了我的答案。
In [83]: df.groupby('is_decreasing')['Balance'].sum()
Out[83]: 
is_decreasing
False            18.670919
True              1.259299
Name: Balance, dtype: float64
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
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_increasing)  # row-wise monotonic (default axis is 0)

Out[33]: 
A     True
B     True
C    False
dtype: bool

my_df.apply(lambda x: x.is_monotonic_increasing, axis=1)  # column-wise monotonic

Out[34]: 
0     True
1    False
2    False
dtype: bool
months = ['Jan', 'Feb', 'Mar', 'Apr']

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