【问题标题】:how to cyclic roll/shift of a pandas series如何循环滚动/移动熊猫系列
【发布时间】:2021-01-08 11:13:53
【问题描述】:

我喜欢像时钟一样循环旋转行,但我想要每一行 将根据“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"])

【问题讨论】:

  • 解决方案有问题?

标签: python pandas shift cyclic


【解决方案1】:

您可以重用现有函数,将 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

【讨论】:

  • 不使用skimage有没有更简单的使用方法?
  • @matan - 一个想法是使用this 方法。
  • @matan - 我在这里使用 numpy 方法,因为性能。但也可能存在一些循环缓慢的解决方案。
  • 谢谢,我会尝试使用你的链接
猜你喜欢
  • 2023-01-19
  • 2020-07-26
  • 2019-02-13
  • 1970-01-01
  • 2014-01-30
  • 2018-07-30
  • 1970-01-01
  • 1970-01-01
  • 2015-05-28
相关资源
最近更新 更多