Проверьте, это заимствует идею из 3-х библиотек языков программирования dplyr, tidyr, R, следующий код предназначен только для демонстрации, поэтому я создал два df: df1, df2, вы можете динамически создавать dfs и объединять их:
import pandas as pd
def gather(df, key, value, cols):
id_vars = [col for col in df.columns if col not in cols]
id_values = cols
var_name = key
value_name = value
return pd.melt(df, id_vars, id_values, var_name, value_name)
df1 = pd.DataFrame({'A': [1, 2, 3]})
df2 = pd.DataFrame({'B': [1, 4]})
df_messy = pd.concat([df1, df2], axis=1)
print(df_messy)
df_tidy = gather(df_messy, 'type', 'value', df_messy.columns).dropna()
print(df_tidy)
И вы получили вывод для df_messy
A B
0 1 1.0
1 2 4.0
2 3 NaN
вывод для df_tidy
type value
0 A 1.0
1 A 2.0
2 A 3.0
3 B 1.0
4 B 4.0
PS: Запомните, чтобы преобразовать тип значений из типа float в тип int,Я просто записал это для демонстрации и не уделил слишком много внимания деталям.