在数据科学中,随机打乱Pandas DataFrame的行是一项频繁的操作,对于创建训练和测试数据集、随机抽样或仅仅为了分析而随机化数据等任务至关重要。本文探讨了实现此目标的三种高效方法,并重点介绍了它们的优缺点。
目录
Pandas sample()
方法
Pandas 的sample()
方法提供了一种用户友好的方法来打乱DataFrame的行。通过将frac
参数设置为1,您可以获得原始DataFrame的完全随机排序。
import pandas as pd
# 示例DataFrame
data = {'col1': [1, 2, 3, 4, 5], 'col2': ['A', 'B', 'C', 'D', 'E']}
df = pd.DataFrame(data)
# 使用sample()打乱
shuffled_df = df.sample(frac=1, random_state=42) # random_state 用于复现结果
print("原始DataFrame:n", df)
print("n打乱后的DataFrame:n", shuffled_df)
random_state
参数对于结果的可重复性至关重要。指定一个整数可以确保在多次运行中一致的打乱结果。省略它会导致每次打乱结果不同。
NumPy permutation()
函数
NumPy的permutation()
函数生成索引的随机排列。这种方法通常比sample()
更快,特别是对于大型DataFrame,因为它直接操作NumPy数组,效率更高。
import pandas as pd
import numpy as np
# 示例DataFrame
data = {'col1': [1, 2, 3, 4, 5], 'col2': ['A', 'B', 'C', 'D', 'E']}
df = pd.DataFrame(data)
# 使用numpy.random.permutation()打乱
shuffled_indices = np.random.permutation(len(df))
shuffled_df = df.iloc[shuffled_indices]
print("原始DataFrame:n", df)
print("n打乱后的DataFrame:n", shuffled_df)
为了获得可重复的结果,请在调用np.random.permutation()
之前使用np.random.seed(42)
。
Scikit-learn shuffle()
函数
Scikit-learn的shuffle()
函数在与相关数组(例如,监督学习设置中的标签)一起打乱DataFrame时特别有用。它确保DataFrame和数组在打乱后保持同步。
import pandas as pd
from sklearn.utils import shuffle
# 示例DataFrame
data = {'col1': [1, 2, 3, 4, 5], 'col2': ['A', 'B', 'C', 'D', 'E']}
df = pd.DataFrame(data)
# 打乱DataFrame和单独的数组(如果需要)
shuffled_df, _ = shuffle(df, random_state=42) # 下划线忽略第二个返回值
print("原始DataFrame:n", df)
print("n打乱后的DataFrame:n", shuffled_df)
与以前的方法一样,random_state
控制可重复性。下划线_
丢弃第二个返回值(如果提供了一个数组,它将是打乱后的数组)。
结论:每种方法都能有效地打乱DataFrame的行。Pandas sample()
最直观,而NumPy的permutation()
对于大型数据集通常具有更好的性能。Scikit-learn的shuffle()
非常适合同时打乱DataFrame和相应的数组。选择最适合您需求的方法,并始终使用random_state
来获得可重复的结果。