我有两列csv:“上下文”,“话语”。
我需要随机播放(制作随机顺序)“上下文”列值。注意,不是完整行要洗牌,而是只有1列,第二列“话语”顺序保持不变。
为此我用过:答案(shuffling/permutating a DataFrame in pandas)
train_df2 = pd.read_csv("./data/nolabel.csv", encoding='utf-8', sep=",")
train_df2.drop('Utterance', axis=1, inplace=True) # delete 'Utterance'
train_df2 = train_df2.sample(frac=1) # shuffle
train_df2['Utterance'] = train_moscow_df['Utterance'] # add back 'Utterance'
train_df2["Label"] = 0
header = ["Context", "Utterance", "Label"] #
train_df2.to_csv('./data/label0.csv', columns = header, encoding='utf-8', index = False)
但是,结果很糟糕:我有一个完整的行shuffle,但是来自2列的相应值仍然相同。
我需要第1列的第1个值对应于第2列的随机值。 (也试过from sklearn.utils import shuffle
但也没有运气)
答案 0 :(得分:2)
问题是,当df被混洗时,索引被洗牌但是然后你将原始列添加回来并且它将在原始索引上对齐,你可以调用reset_index
以便它不会这样做:
train_df2 = train_df2.sample(frac=1) # shuffle
train_df2.reset_index(inplace=True, drop=True)
train_df2['Utterance'] = train_moscow_df['Utterance'] # add back 'Utterance'
示例:
In [196]:
# setup
df = pd.DataFrame(np.random.randn(5,2), columns=list('ab'))
df
Out[196]:
a b
0 0.116596 -0.684748
1 -0.133922 -0.969933
2 0.103551 0.912101
3 -0.279751 -0.348443
4 1.453413 0.062378
现在我们像以前一样放弃和洗牌,注意索引值
In [197]:
a = df.drop('b', axis=1)
a = a.sample(frac=1)
a
Out[197]:
a
3 -0.279751
0 0.116596
1 -0.133922
4 1.453413
2 0.103551
现在重置
In [198]:
a.reset_index(inplace=True, drop=True)
a
Out[198]:
a
0 -0.279751
1 0.116596
2 -0.133922
3 1.453413
4 0.103551
我们可以添加列但保留随机顺序:
In [199]:
a['b'] = df['b']
a
Out[199]:
a b
0 -0.279751 -0.684748
1 0.116596 -0.969933
2 -0.133922 0.912101
3 1.453413 -0.348443
4 0.103551 0.062378