我一直在使用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开始时如何获得位置?
答案 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,!=0
和df['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
对不同的群集执行操作。