我可以a從每個分組中進行采樣b,如下所示。df = pd.DataFrame({'a': [10,20,30,40,50,60,70], 'b': [1,1,1,0,0,0,0]})df.groupby('b', as_index=False)['a'].apply(lambda x: x.sample(n=3))給出:b a0 3 40 4 50 5 601 0 10 2 30 1 20但是,如果我想對n元素進行采樣,則n必須設置為最多一個組中的元素數量(如果我們想要的話replace=False)是否有一種干凈的方法來對n組中的元素進行采樣,最多可達最大數量的項目?例如,在給定的 DataFrame: in 中b,存在三個值為 的項目1。如果我愿意df.groupby('b').apply(lambda x: x.sample(n=4)),(注意n=4)這就會破裂。對每組進行最大采樣的干凈方法是什么?
2 回答

慕標5832272
TA貢獻1966條經驗 獲得超4個贊
將其包裹起來min是一個選項:
df = pd.DataFrame({'a': [10,20,30,40,50,60,70],
? ? ? ? ? ? ? ? ? ?'b': [1,1,1,0,0,0,0]})
n = 4
df.groupby('b', as_index=False)['a'].apply(lambda x: x.sample(n=min(10, len(x))))
輸出:
0? 3? ? 40
? ?4? ? 50
? ?6? ? 70
? ?5? ? 60
1? 2? ? 30
? ?1? ? 20
? ?0? ? 10
Name: a, dtype: int64
或者,如果您總是想對最大值進行采樣(即隨機洗牌),請使用frac:
df.groupby('b', as_index=False)['a'].apply(lambda x: x.sample(frac=1))
輸出:
0? 6? ? 70
? ?4? ? 50
? ?5? ? 60
? ?3? ? 40
1? 2? ? 30
? ?1? ? 20
? ?0? ? 10
Name: a, dtype: int64
請注意pandas-1.1.0
,您可以直接sample
從 groupby 對象訪問。

SMILET
TA貢獻1796條經驗 獲得超4個贊
您可以通過將預先指定的最大樣本大小與組的大小進行比較來自適應地修改樣本大小。
max_sample = 4 df.groupby('b')['a'].apply(lambda x: x.sample(n=max_sample if len(x)>max_sample else len(x)))
添加回答
舉報
0/150
提交
取消