20_Pandas.DataFrame中Series行的随机洗牌
通过使用sample()方法,可以随机重新排列(改组)pandas.DataFrame和pandas.Series的行。虽然还有许多其他方法,但是使用sample()方法很方便,因为不需要导入其他模块。
以下面的数据为例。
import pandas as pd
df = pd.read_csv('./data/20/sample_pandas_normal.csv')
print(df)
# name age state point
# 0 Alice 24 NY 64
# 1 Bob 42 CA 92
# 2 Charlie 18 CA 70
# 3 Dave 68 TX 70
# 4 Ellen 24 CA 88
# 5 Frank 30 NY 57
该示例是pandas.DataFrame,但是也可以用类似的方式对pandas.Series进行洗牌。
请注意,sort_values()和sort_index()用于根据索引和列值对行进行无序排序。请参阅下面的文章。
sample()方法指定参数frac = 1
有关sample()方法的详细信息,请参见以下文章。
如果参数frac = 1,则意味着对所有行进行随机采样,这等效于对整个行进行随机重排(随机播放)。
df_s = df.sample(frac=1)
print(df_s)
# name age state point
# 2 Charlie 18 CA 70
# 5 Frank 30 NY 57
# 4 Ellen 24 CA 88
# 1 Bob 42 CA 92
# 0 Alice 24 NY 64
# 3 Dave 68 TX 70
可以通过指定参数random_state来固定随机数种子。它们总是以相同的方式排序。
df_s = df.sample(frac=1, random_state=0)
print(df_s)
# name age state point
# 5 Frank 30 NY 57
# 2 Charlie 18 CA 70
# 1 Bob 42 CA 92
# 3 Dave 68 TX 70
# 0 Alice 24 NY 64
# 4 Ellen 24 CA 88
使用reset_index()方法重新分配索引(行号)
可以使用reset_index()方法重新分配改组后的对象的索引(行号)。使用参数drop = True删除原始索引。
df_s = df.sample(frac=1).reset_index(drop=True)
print(df_s)
# name age state point
# 0 Ellen 24 CA 88
# 1 Charlie 18 CA 70
# 2 Alice 24 NY 64
# 3 Dave 68 TX 70
# 4 Frank 30 NY 57
# 5 Bob 42 CA 92
更新原始对象
使用此方法,无法更改原始对象本身,因此,如果要更新原始对象,请将其分配给原始对象并覆盖它。
df = df.sample(frac=1).reset_index(drop=True)
print(df)
# name age state point
# 0 Dave 68 TX 70
# 1 Bob 42 CA 92
# 2 Charlie 18 CA 70
# 3 Alice 24 NY 64
# 4 Ellen 24 CA 88
# 5 Frank 30 NY 57