我想从没有for循环的B列创建C列。。。你知道吗
数据帧:
# | A | B | C
--+-----+----+-----
1 | 2 | 3 | 4
2 | 3 | 3 | 4
3 | 4 | 4 | 6
4 | 5 | 4 | 6
5 | 5 | 4 | 6
6 | 3 | 6 | 2
7 | 2 | 6 | 2
8 | 4 | 2 | 3 #< --- loop back around if possible (B value at index 1)
基本上,我想得到B中下一个变化的值,并将其设置为一个新的列C
到目前为止,答案是:Determining when a column value changes in pandas dataframe 我有:
df_filtered = df[df['B'].diff() != 0]
但在那之后,我不知道如何在不使用循环的情况下创建C。。。你知道吗
编辑: @(Ayoub ZAROU)的回答回答了我最初的问题,但是,我注意到如果我们假设数据中有一个循环,我的示例dataframe并不能涵盖所有情况:
# | A | B | C
--+-----+----+-----
1 | 2 | 3 | 4
2 | 3 | 3 | 4
3 | 4 | 4 | 6
4 | 5 | 4 | 6
5 | 5 | 4 | 6
6 | 3 | 6 | 2
7 | 2 | 6 | 2
8 | 4 | 2 | 3
9 | 3 | 3 | 4
10| 2 | 3 | 4
在这种情况下,如果将3的最后一段视为3的第一段的一部分,则使用此解决方案C中的最后两个值将不正确。你知道吗
不过,一个简单的解决方法是将最后几个元素移到列表的开头,反之亦然
shift
B
,groupby on originaldf.B
。最后,transform
和fillna
您还可以将
np.roll
与assign
一起使用,在C
上创建列C
和groupbyB
和transform
。这样做,您不需要shift
和fillna
你可以试试看,注意
np.roll
和pandas中的shift是一样的,唯一的区别是它允许你滚动值, 在下面,c
给出了没有变化的索引然后我们将那里的值设置为} 进行设置,注意,如果更改列
B
列上的下一个值,使用np.roll和^{c
不是True
然后我们在pandas上使用
bfill
填充剩余的行,并将其转换为B
'列dtype
, 所以,在全球范围内,你是这样做的另一种方法是获取值更改:
以及查找映射:
然后使用这些来查找“下一个”:
要创建列,需要忽略索引中的重复项:
相关问题 更多 >
编程相关推荐