Для решения general вы можете попробовать один из следующих двух вариантов:
Вы можете попробовать это, используя OrderedDict
, чтобы получить alpha-nonnumeri c имена столбцов упорядочены в алфавитном порядке, pd.DataFrame.filter
для фильтрации столбцов с похожими именами, а затем объединить значения с pd.DataFrame.stack
:
import pandas as pd
from collections import OrderedDict
df = pd.DataFrame([[0,1,2,3,4],[5,6,7,8,9]], columns=['a1','a2','b1','b2','c'])
newdf=pd.DataFrame()
for col in list(OrderedDict.fromkeys( ''.join(df.columns)).keys()):
if col.isalpha():
newdf[col]=df.filter(like=col, axis=1).stack().reset_index(level=1,drop=True)
newdf=newdf.reset_index(drop=True)
Выход:
df
a1 a2 b1 b2 c
0 0 1 2 3 4
1 5 6 7 8 9
newdf
a b c
0 0 2 4
1 1 3 4
2 5 7 9
3 6 8 9
Другой способ получить имена столбцов - использовать re
и set
, как здесь, а затем отсортировать столбцы в алфавитном порядке:
newdf=pd.DataFrame()
import re
for col in set(re.findall('[^\W\d_]',''.join(df.columns))):
newdf[col]=df.filter(like=col, axis=1).stack().reset_index(level=1,drop=True)
newdf=newdf.reindex(sorted(newdf.columns), axis=1).reset_index(drop=True)
Вывод:
newdf
a b c
0 0 2 4
1 1 3 4
2 5 7 9
3 6 8 9