我想对一个 Dataframe 中的每n行(窗口大小)进行混洗,但我不知道如何用Python的方式来实现。我找到了混洗所有行的答案,但没有找到给定窗口大小的答案:
def permute(df: pd.DataFrame, window_size: int = 10) -> pd.DataFrame:
df_permuted = df.copy()
"""How would you shuffle every window_size rows for the modifiable columns?"""
df_permuted.loc[:, modifiable_columns]
...
return df_permuted
3条答案
按热度按时间kb5ga3dv1#
这段代码定义了一个名为permute的函数,该函数接收Pandas Dataframe 和窗口大小(默认设置为10),并返回一个经过混洗的新 Dataframe 。
该函数首先通过将输入 Dataframe 的长度除以窗口大小来计算窗口的数量。然后,它迭代窗口,并使用 Dataframe 的sample方法(随机重新排序行)重排每个窗口中的行。最后,它使用concat方法将所有重排的窗口连接到一个 Dataframe 中,并返回此 Dataframe 。
然后,代码通过创建一个小的 Dataframe 并将其打印出来来测试置换函数,然后在窗口大小为3的 Dataframe 上调用置换函数并打印出混洗后的 Dataframe 。
输出:
w8f9ii692#
接受的答案没有矢量化。使用
groupby.sample
是更好的选择:sc4hvdpw3#
要添加代码注解中的附加要求,但问题中没有,这里有一个版本也考虑了可修改的列。
在下面的示例中,
mod
和mod2
是可修改的列,而nomod
列是不可修改的。我认为使用向量化方法无法实现可修改的列,因此将其添加到已接受的答案中,而且已接受的答案在内存中保留了整个df的另一个完整表示,而我的版本只保留了
window_size
大小的内存记录。