Pandas shuffle列值不起作用

时间:2017-02-02 16:21:50

标签: python pandas dataframe

我有两列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但也没有运气)

1 个答案:

答案 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