Проблема: Создайте наиболее эффективную функцию, чтобы превратить 1d массив (столбец group_id) в другой 1d массив (выходной столбец).
Условия:
Максимум n
групп может быть в любой партии, в этом примере n=2
.
Каждая партия должна содержать группы одинакового размера.
Тривиальное условие: свести к минимуму количество партий.
Функция будет распределять эти группы разного размера по партиям с уникальными идентификаторами при условии, что каждая партияимеет фиксированный размер И каждая партия содержит только группы с одинаковым размером.
data = {'group_size': [1,2,3,1,2,3,4,5,1,2,1,1,1],
'batch_id': [1,4,6,1,4,6,7,8,2,5,2,3,3]}
df = pd.DataFrame(data=data)
print(df)
group_size batch_id
0 1 1
1 2 4
2 3 6
3 1 1
4 2 4
5 3 6
6 4 7
7 5 8
8 1 2
9 2 5
10 1 2
11 1 3
12 1 3
Что мне нужно:
some_function( data['group_size'] )
, чтобы дать мне data['batch_id']
Редактировать:
Моя неуклюжая функция
def generate_array():
out = 1
batch_size = 2
dictionary = {}
for i in range(df['group_size'].max()):
# get the mini df corresponding to the group size
sub_df = df[df['group_size'] == i+1 ]
# how many batches will we create?
no_of_new_batches = np.ceil ( sub_df.shape[0] / batch_size )
# create new array
a = np.repeat(np.arange(out, out+no_of_new_batches ), batch_size)
shift = len(a) - sub_df.shape[0]
# remove last elements from array to match the size
if len(a) != sub_df.shape[0]:
a = a[0:-shift]
# update batch id
out = out + no_of_new_batches
# create dictionary to store idx
indexes = sub_df.index.values
d = dict(zip(indexes, a))
dictionary.update(d)
array = [dictionary[i] for i in range(len(dictionary))]
return array
generate_array()
Out[78]:
[1.0, 4.0, 6.0, 1.0, 4.0, 6.0, 7.0, 8.0, 2.0, 5.0, 2.0, 3.0, 3.0]