从数据框列中随机选择行

时间:2020-04-27 17:55:24

标签: python pandas dataframe

对于给定的dataframe列,我想随机选择大约60%并添加到新列,将剩余的40%添加到另一列,将40%列乘以(-1),然后创建一个新列将它们像这样合并在一起:

dict0 = {'x1': [1,2,3,4,5,6]}
data = pd.DataFrame(dict0)### 

dict1 = {'x1': [1,2,3,4,5,6],'x2': [1,'nan',3,'nan',5,6],'x3': ['nan',2,'nan',4,'nan','nan']}
data = pd.DataFrame(dict1)### 


dict2 = {'x1': [1,2,3,4,5,6],'x2': [1,'nan',3,'nan',5,6],'x3': ['nan',-2,'nan',-4,'nan','nan']}
data = pd.DataFrame(dict2)### 

dict3 = {'x1': [1,2,3,4,5,6],'x2': [1,'nan',3,'nan',5,6],'x3': ['nan',-2,'nan',-   4,'nan','nan'],,'x4': [1,-2,3,-4,5,6]}
data = pd.DataFrame(dict3)### 

2 个答案:

答案 0 :(得分:2)

如果不需要中间列:

mask = np.random.choice([1,-1], p=[0.6,0.4], size=len(data))

data['x4'] = data['x1']*mask

当然中间列也很容易

data['x2'] = data['x1'].where(mask==1)

data['x3'] = data['x1'].mask(mask==1)
# or data['x3'] = data['x1'].where(mask==-1)

答案 1 :(得分:1)

尽管first answer提出了一种优雅的解决方案,但它扩展了规定的要求,以选择大约60%个行。问题在于它不能保证60/40的分配。使用概率,选定的样本可能很容易是全部1或全部-1,实际上是选择 all no 行,而不是大约60%

出现这种情况的可能性随着较大的数据帧而明显减少,但是它永远不会为零,并且在使用提供的示例数据进行尝试时立即可见。

如果这与您相关,请看一下这段代码,它确实保证行比率为60/40。

indices = np.random.choice(len(data), size=int(0.4 * len(data)), replace=False)
data['x4'] = np.where(data.index.isin(indices), -1 * data['x1'], data['x1'])

更新:您的后续问题中的一个answer建议df.sample。确实,它使您可以更优雅地表达以上内容:

indices = data.sample(frac=0.4).index
data['x4'] = np.where(data.index.isin(indices), -data['x1'], data['x1'])