Если хотите назначить каждому N значений отдельную категорию, создайте словарь для каждого N фрагментов, а затем map
:
#https://stackoverflow.com/a/312464/2901002
def chunks(lst, n):
"""Yield successive n-sized chunks from lst."""
for i in range(0, len(lst), n):
yield lst[i:i + n]
L = ['A','B','C','D']
d = {v: k for k, x in zip(L, chunks(df.columns, 3)) for v in x}
print (d)
{'a': 'A', 'b': 'A', 'c': 'A',
'd': 'B', 'e': 'B', 'f': 'B',
'g': 'C', 'h': 'C', 'i': 'C',
'j': 'D', 'k': 'D', 'l': 'D'}
df.columns = [df.columns.map(d), df.columns]
print (df)
A B C D
a b c d e f g h i j k l
1 1.0 1.0 1.0 2.0 3.0 2.0 1.0 1.0 1.0 2.0 3.0 2.0
2 4.0 5.0 4.0 4.0 8.0 4.0 4.0 5.0 4.0 4.0 8.0 4.0
3 6.0 1.0 6.0 7.0 8.0 7.0 6.0 1.0 6.0 7.0 8.0 7.0
РЕДАКТИРОВАТЬ: При необходимости установите столбцы по позициям:
d1 = {'A':df.columns[0:3],
'B':df.columns[3:6],
'C':df.columns[6:9],
'D':df.columns[9:12]}
print (d1)
{'A': Index(['a', 'b', 'c'], dtype='object'),
'B': Index(['d', 'e', 'f'], dtype='object'),
'C': Index(['g', 'h', 'i'], dtype='object'),
'D': Index(['j', 'k', 'l'], dtype='object')}
d = {v: k for k, x in d1.items() for v in x}
print (d)
{'a': 'A', 'b': 'A', 'c': 'A',
'd': 'B', 'e': 'B', 'f': 'B',
'g': 'C', 'h': 'C', 'i': 'C',
'j': 'D', 'k': 'D', 'l': 'D'}
df.columns = [df.columns.map(d), df.columns]
print (df)
A B C D
a b c d e f g h i j k l
1 1.0 1.0 1.0 2.0 3.0 2.0 1.0 1.0 1.0 2.0 3.0 2.0
2 4.0 5.0 4.0 4.0 8.0 4.0 4.0 5.0 4.0 4.0 8.0 4.0
3 6.0 1.0 6.0 7.0 8.0 7.0 6.0 1.0 6.0 7.0 8.0 7.0