2 回答

TA貢獻(xiàn)1966條經(jīng)驗(yàn) 獲得超4個(gè)贊
將其包裹起來(lái)min是一個(gè)選項(xiàng):
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
或者,如果您總是想對(duì)最大值進(jìn)行采樣(即隨機(jī)洗牌),請(qǐng)使用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
請(qǐng)注意pandas-1.1.0
,您可以直接sample
從 groupby 對(duì)象訪問(wèn)。

TA貢獻(xiàn)1796條經(jīng)驗(yàn) 獲得超4個(gè)贊
您可以通過(guò)將預(yù)先指定的最大樣本大小與組的大小進(jìn)行比較來(lái)自適應(yīng)地修改樣本大小。
max_sample = 4 df.groupby('b')['a'].apply(lambda x: x.sample(n=max_sample if len(x)>max_sample else len(x)))
添加回答
舉報(bào)