在 pandas 中按行或按列对数据帧进行洗牌的简单而有效的方法是什么? IE。如何编写函数shuffle(df, n, axis=0)
这需要一个数据帧,许多洗牌n
, 和一个轴(axis=0
是行,axis=1
是列)并返回已洗牌的数据帧的副本 n
次。
编辑:关键是在不破坏数据框的行/列标签的情况下执行此操作。如果你只是洗牌df.index
这会丢失所有这些信息。我想要结果 df
除了行的顺序或列的顺序不同之外,与原来的相同。
Edit2:我的问题不清楚。当我说洗牌时,我的意思是独立洗牌每一行。因此,如果您有两列 a
和 b
,我希望每一行都自己洗牌,这样你在 a
之间就没有相同的关联。和 b
就像您只是将每一行作为一个整体重新排序一样。类似的东西:
for 1...n:
for each col in df: shuffle column
return new_df
但希望比简单循环更有效。这对我不起作用:
def shuffle(df, n, axis=0):
shuffled_df = df.copy()
for k in range(n):
shuffled_df.apply(np.random.shuffle(shuffled_df.values),axis=axis)
return shuffled_df
df = pandas.DataFrame({'A':range(10), 'B':range(10)})
shuffle(df, 5)
最佳答案
使用numpy的random.permuation
函数:
In [1]: df = pd.DataFrame({'A':range(10), 'B':range(10)})
In [2]: df
Out[2]:
A B
0 0 0
1 1 1
2 2 2
3 3 3
4 4 4
5 5 5
6 6 6
7 7 7
8 8 8
9 9 9
In [3]: df.reindex(np.random.permutation(df.index))
Out[3]:
A B
0 0 0
5 5 5
6 6 6
3 3 3
8 8 8
7 7 7
9 9 9
1 1 1
2 2 2
4 4 4
关于python - 改组/排列 Pandas 中的DataFrame,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15772009/