In primo luogo, separare le colonne:
In [11]: from collections import defaultdict
pos = defaultdict(list)
vals = defaultdict(list)
In [12]: for i, c in enumerate(df_dummies.columns):
if "_" in c:
k, v = c.split("_", 1)
pos[k].append(i)
vals[k].append(v)
else:
pos["_"].append(i)
In [13]: pos
Out[13]: defaultdict(list, {'_': [0], 'm': [1, 2, 3], 'qj': [4, 5, 6]})
In [14]: vals
Out[14]: defaultdict(list, {'m': ['M1', 'M2', 'M7'], 'qj': ['q23', 'q4', 'q9']})
Questo consente di suddividere nelle varie cornici per ogni colonna dummied:
In [15]: df_dummies.iloc[:, pos["m"]]
Out[15]:
m_M1 m_M2 m_M7
0 1 0 0
1 0 1 0
2 0 0 1
3 1 0 0
4 0 1 0
5 1 0 0
Ora possiamo usare argmax di NumPy:
In [16]: np.argmax(df_dummies.iloc[:, pos["m"]].values, axis=1)
Out[16]: array([0, 1, 2, 0, 1, 0])
* Nota: panoramica Das idxmax restituisce l'dell'etichetta, vogliamo la posizione in modo da poter usare categorici *
In [17]: pd.Categorical.from_codes(np.argmax(df_dummies.iloc[:, pos["m"]].values, axis=1), vals["m"])
Out[17]:
[M1, M2, M7, M1, M2, M1]
Categories (3, object): [M1, M2, M7]
Ora siamo in grado di mettere tutto questo insieme:.
In [21]: df = pd.DataFrame({k: pd.Categorical.from_codes(np.argmax(df_dummies.iloc[:, pos[k]].values, axis=1), vals[k]) for k in vals})
In [22]: df
Out[22]:
m qj
0 M1 q23
1 M2 q4
2 M7 q9
3 M1 q23
4 M2 q23
5 M1 q9
e rimettere le colonne non dummied :
In [23]: df[df_dummies.columns[pos["_"]]] = df_dummies.iloc[:, pos["_"]]
In [24]: df
Out[24]:
m qj Budget
0 M1 q23 39
1 M2 q4 15
2 M7 q9 13
3 M1 q23 53
4 M2 q23 82
5 M1 q9 70
In funzione:
def reverse_dummy(df_dummies):
pos = defaultdict(list)
vals = defaultdict(list)
for i, c in enumerate(df_dummies.columns):
if "_" in c:
k, v = c.split("_", 1)
pos[k].append(i)
vals[k].append(v)
else:
pos["_"].append(i)
df = pd.DataFrame({k: pd.Categorical.from_codes(
np.argmax(df_dummies.iloc[:, pos[k]].values, axis=1),
vals[k])
for k in vals})
df[df_dummies.columns[pos["_"]]] = df_dummies.iloc[:, pos["_"]]
return df
In [31]: reverse_dummy(df_dummies)
Out[31]:
m qj Budget
0 M1 q23 39
1 M2 q4 15
2 M7 q9 13
3 M1 q23 53
4 M2 q23 82
5 M1 q9 70
Torna a df? Non sei sicuro di cosa intendi esattamente. –
Ho solo specificato di tornare indietro/ripristinare – user3313834
Grazie. Volevo solo essere sicuro. –