簡體   English   中英

從 dataframe 列中隨機選擇行

[英]Randomly selecting rows from dataframe column

對於給定的 dataframe 列,我想隨機將 select 大約 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)### 

如果您不需要中間列:

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)

雖然第一個答案提出了一個優雅的解決方案,但它將規定的要求擴展到 select大約 60%的行。 問題是它不能保證 60/40 的分布。 使用概率,所選樣本可能很容易全部為1或全部為-1 ,實際上選擇了所有行或沒有行,而不是大約 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'])

更新:您的后續問題的一個答案提出df.sample 事實上,它可以讓你更優雅地表達上述內容:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM