如何循环滚动/移动熊猫系列

我想像时钟一样周期性地旋转行,但我希望每一行 会根据“ n_roll”列的不同而旋转

所以如果我有那个df

data={"col1":[2,3,4,5],"col2":[4,2,6],"col3":[7,6,9,11],"col4":[14,11,22,8],"name":["A","A","V","A"],"n_roll":[1,3]}
df=pd.DataFrame.from_dict(data)
df

所以我希望它看起来像这样

data={"col1":[14,"col2":[2,"col3":[4,"col4":[7,3]}
df=pd.DataFrame.from_dict(data)
df

也许是这样的: coll_to_roll = [“ col1”,“ col2”,“ col3”,“ col4”]

df[coll_to_roll] = np.roll(df[coll_to_roll],1,df["n_roll"])
iCMS 回答:如何循环滚动/移动熊猫系列

您可以通过将DataFrame和column转换为numpy数组来重用现有功能:

coll_to_roll=["col1","col2","col3","col4"]

from skimage.util.shape import view_as_windows as viewW

#https://stackoverflow.com/a/51613442
def strided_indexing_roll(a,r):
    # Concatenate with sliced to cover all rolls
    a_ext = np.concatenate((a,a[:,:-1]),axis=1)

    # Get sliding windows; use advanced-indexing to select appropriate ones
    n = a.shape[1]
    return viewW(a_ext,(1,n))[np.arange(len(r)),(n-r)%n,0]


df[coll_to_roll]=strided_indexing_roll(df[coll_to_roll].to_numpy(),df["n_roll"].to_numpy())
print (df)
   col1  col2  col3  col4 name  n_roll
0    14     2     4     7    A       1
1     6    11     3     2    A       2
2     9    22     4     4    V       2
3     6    11     8     5    A       3
本文链接:https://www.f2er.com/1525740.html

大家都在问