我喜欢像循环时钟一样旋转行,但我喜欢每一行将根据";n_ roll";
所以如果我有df
data={"col1":[2,3,4,5],
"col2":[4,2,4,6],
"col3":[7,6,9,11],
"col4":[14,11,22,8],
"name":["A","A","V","A"],
"n_roll":[1,2,2,3]}
df=pd.DataFrame.from_dict(data)
df
所以我希望它看起来像这个
data={"col1":[14,6,9,6],
"col2":[2,11,22,11],
"col3":[4,3,4,8],
"col4":[7,2,4,5],
"name":["A","A","V","A"],
"n_roll":[1,2,2,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"])
您可以通过将DataFrame和列转换为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