我有一个像这样的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来完成总和,但是我该如何创建这个列呢?
谢谢, 安
答案 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_increasing
是 is_monotonic
的别名,因此您可以使用任何一个
答案 3 :(得分:-1)
Pandas 0.19 添加了公开Series.is_monotonic
API(如上所述,algos
模块未记录,无法保证保留。)。
还有is_monotonic_increasing
和is_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