Pandas + Python - 如何知道值何时发生变化?

时间:2016-10-23 19:36:25

标签: python pandas

我一直在使用DataFrame,就像下面的摘录一样,我想知道值何时发生变化:

     A     M     C
0   2.0    1    C1
1   2.0    1    C1
2   2.0    2    C1
3   2.0    2    C1
4   2.0    3    C1
5   2.0    3    C1
6   2.0    1    C2
7   2.0    1    C2
8   2.0    2    C2
9   2.0    2    C3
10  2.0    3    C3
11  2.0    3    C3
13  2.1    1    C3
14  2.1    1    C3
15  2.1    2    C3
16  2.1    2    C3
17  2.1    3    C3
18  2.1    3    C3

我知道A或C总是在M开始时改变1.问题是我每次M值从1开始时如何获得位置?

2 个答案:

答案 0 :(得分:2)

我不知道你的整个数据集的构建方式是否与你展示的数据集相同,但我可以看到你在m列中搜索3到1的出现,这会产生差异-2:

df[df['M'].diff()==-2].index
Out[101]: Int64Index([6, 13], dtype='int64')

假设您的M列总是增加,但它可以高于3,您可以只查找第一次出现的负数,例如:

df[df['M'].diff()<0].index
Out[103]: Int64Index([6, 13], dtype='int64')

让我们说你可以做的就是没有模式:

df[(df['M'].diff()!=0) & (df['M']==1)].index
Out[104]: Int64Index([0, 6, 13], dtype='int64')

这是添加索引0,因为.diff()将为数据帧的第一个索引返回NaN,!=0df['M'] ==0

答案 1 :(得分:2)

确定新M套装何时开始的另一种方法是找到M为1的位置,而前一个M不是:

In [18]: (df['M'] == 1) & (df["M"].shift() != 1)
Out[18]: 
0      True
1     False
2     False
3     False
4     False
5     False
6      True
7     False
[.. and so on]
Name: M, dtype: bool

这包括第一个元素,但通常是有意义的。一旦你有了这个,你可以拿它的累积总和得到一个与每个组相关联的组号(因为True == 1和False == 0):

In [19]: df["group_index"] = ((df['M'] == 1) & (df["M"].shift() != 1)).cumsum()

In [20]: df
Out[20]: 
      A  M   C  group_index
0   2.0  1  C1            1
1   2.0  1  C1            1
2   2.0  2  C1            1
3   2.0  2  C1            1
4   2.0  3  C1            1
5   2.0  3  C1            1
6   2.0  1  C2            2
7   2.0  1  C2            2
[.. and so on]

这很方便,因为您可以使用groupby对不同的群集执行操作。