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)]