Используйте DataFrame.select_dtypes
для получения столбцов по типам, измените форму на stack
и объедините concat
:
df = df.reset_index(drop=True)
df1 = df.set_index(['time','place'], append=True)
a = df1.select_dtypes(object).stack().rename('source').reset_index(level=3)
b = df1.select_dtypes(np.number).stack().rename('value').reset_index(level=3, drop=True)
df2 = (pd.concat([a, b], axis=1)
.reset_index(level=[1,2])
.rename(columns={'level_3':'parameter'})
.sort_values(['place','parameter'])
.reset_index(drop=True)
)
print (df2)
time place parameter source value
0 2/4/2018 U.K Pressure C 2
1 3/4/2018 U.K Pressure D 6
2 4/4/2018 U.K Pressure A 1
3 5/4/2018 U.K Pressure A 4
4 2/4/2018 U.K Temperature A 3
5 3/4/2018 U.K Temperature C 4
6 4/4/2018 U.K Temperature B 6
7 5/4/2018 U.K Temperature D 8
Другое решение для выбранной пары и непарного столбца после первых 2 столбцов:
df = df.reset_index(drop=True)
df1 = df.set_index(['time','place'], append=True)
a = df1.iloc[:, ::2].stack().rename('source').reset_index(level=3)
b = df1.iloc[:, 1::2].stack().rename('value').reset_index(level=3, drop=True)
df2 = (pd.concat([a, b], axis=1)
.reset_index(level=[1,2])
.rename(columns={'level_3':'parameter'})
.sort_values(['place','parameter'])
.reset_index(drop=True)
)
print (df2)
time place parameter source value
0 2/4/2018 U.K Pressure C 2
1 3/4/2018 U.K Pressure D 6
2 4/4/2018 U.K Pressure A 1
3 5/4/2018 U.K Pressure A 4
4 2/4/2018 U.K Temperature A 3
5 3/4/2018 U.K Temperature C 4
6 4/4/2018 U.K Temperature B 6
7 5/4/2018 U.K Temperature D 8