Мне нужно обработать целый фрейм данных с несколькими тысячами строк, но я могу упростить его, как показано ниже:
df = pd.DataFrame([
('a', 1, 1),
('a', 0, 0),
('a', 0, 1),
('b', 0, 0),
('b', 1, 0),
('b', 0, 1),
('c', 1, 1),
('c', 1, 0),
('c', 1, 0)
], columns=['A', 'B', 'C'])
print (df)
A B C
0 a 1 1
1 a 0 0
2 a 0 1
3 b 0 0
4 b 1 0
5 b 0 1
6 c 1 1
7 c 1 0
8 c 1 0
Моя цель состоит в том, чтобы сгладить столбцы "B" и "C" на основеметка, которую они имеют в столбце «A»
A B_1 B_2 B_3 C_1 C_2 C_3
0 a 1 0 0 1 0 1
3 b 0 1 0 0 0 1
6 c 1 1 1 1 0 0
Код, который я написал, дает желаемый результат, но он довольно медленный, поскольку он использует простой цикл for для уникальных меток.Решение, которое я вижу, состоит в том, чтобы написать некую векторизованную функцию, которая оптимизирует мой код.У кого-нибудь есть идея?Ниже я добавляю код.
added_col = ['B_1', 'B_2', 'B_3', 'C_1', 'C_2', 'C_3']
new_df = df.drop(['B', 'C'], axis=1).copy()
new_df = new_df.iloc[[x for x in range(0, len(df), 3)], :]
new_df = pd.concat([new_df,pd.DataFrame(columns=added_col)], sort=False)
for e, elem in new_df['A'].iteritems():
new_df.loc[e, added_col] = df[df['A'] == elem].loc[:,['B','C']].T.values.flatten()