Использование value_counts
с map
и repeat
:
counts = df.Type.value_counts()
repeat_map = 3 - counts[counts < 3]
df['repeat_num'] = df.Type.map(repeat_map).fillna(0,downcast='infer')
df = df.append(df.set_index('Type')['Val'].repeat(df['repeat_num']).reset_index(),
sort=False, ignore_index=True)[['Type','Val']]
print(df)
Type Val
0 a 1
1 a 2
2 a 3
3 b 1
4 c 3
5 c 2
6 c 1
7 b 1
8 b 1
Примечание: sort=False
для append
присутствует в pandas>=0.23.0
, удалить при использовании более низкой версии.
РЕДАКТИРОВАТЬ: Если данные содержат несколько столбцов val, тогда все столбцы столбцов сделать индексами, кроме одногостолбец и повторите, а затем reset_index как:
df = df.append(df.set_index(['Type','Val_1','Val_2'])['Val'].repeat(df['repeat_num']).reset_index(),
sort=False, ignore_index=True)