Я разделил вывод на 3 кадра данных, потому что каждый из них обрабатывает по-разному - df1
изменяется на DataFrame.melt
, df2
на str.rsplit
столбцов в MultiIndex
и DataFrame.stack
и последний используется перекрестное объединение всех DataFrame
с:
a = np.array([{'content_ID_994': 'BXXXXXXXXX',
'content_ID_995': 'BYYYYYYYYY',
'content_ID_996': 'BZZZZZZZZZ',
'content_ID_997': 'BAAAAAAAAA',
'content_ID_998': 'BBBBBBBBBB',
'content_ID_999': 'BCCCCCCCCC',
'column A': 'value1',
'column B': 'value2',
'module_1_gallery': 'N1',
'module_1_composite': 'F1',
'module_1_collection': 'P1',
'module_2_gallery': 'N2',
'module_2_composite': 'F2',
'module_2_collection': 'P2'}],
dtype=object)
df = pd.DataFrame([a[0]])
m1 = df.columns.str.startswith('content_ID')
m2 = df.columns.str.startswith('module')
df1 = df.loc[:, m1]
df2 = df.loc[:, m2]
df3 = df.loc[:, ~(m1 | m2)]
#print (df1)
#print (df2)
#print (df3)
df1 = df1.melt(value_name='ID')
df2.columns = df2.columns.str.rsplit('_', n=1, expand=True)
df2 = df2.stack(0)
df4 = df1.assign(a=1).merge(df3.assign(a=1).merge(df2.assign(a=1), on='a'), on='a')
df4 = df4.drop(['variable','a'], axis=1)
print (df4)
ID column A column B collection composite gallery
0 BXXXXXXXXX value1 value2 P1 F1 N1
1 BXXXXXXXXX value1 value2 P2 F2 N2
2 BYYYYYYYYY value1 value2 P1 F1 N1
3 BYYYYYYYYY value1 value2 P2 F2 N2
4 BZZZZZZZZZ value1 value2 P1 F1 N1
5 BZZZZZZZZZ value1 value2 P2 F2 N2
6 BAAAAAAAAA value1 value2 P1 F1 N1
7 BAAAAAAAAA value1 value2 P2 F2 N2
8 BBBBBBBBBB value1 value2 P1 F1 N1
9 BBBBBBBBBB value1 value2 P2 F2 N2
10 BCCCCCCCCC value1 value2 P1 F1 N1
11 BCCCCCCCCC value1 value2 P2 F2 N2