2015-06-17 27 views
5

Ho un dataframe in cui alcune colonne indicano se è stata visualizzata una serie di domande del sondaggio. Ad esempio:Unisci più colonne di panda in una nuova colonna

Q1_Seen Q2_Seen Q3_Seen Q4_Seen 
    Q1a  nan  nan  nan 
    nan  Q2a  nan  nan 
    nan  nan  Q3d  nan 
    nan  Q2c  nan  nan 

desidero collassare queste colonne in una colonna, diciamo Q_Seen, che assumere la forma:

Q_Seen 
    Q1a 
    Q2a 
    Q3d 
    Q2c 

noti che ogni riga sarebbe reciprocamente esclusivo: se vi è un valore in una delle colonne, tutti gli altri sarebbero NaN.

Ho provato a farlo con pd.concat, ma non sembra che stia producendo risultati corretti.

risposta

3

Prova questo:

df['Q_Seen'] = df.stack().values 

>>> df 

Q1_Seen Q2_Seen Q3_Seen  Q4_Seen  Q_Seen 
    Q1a  nan  nan   nan  Q1a 
    nan  Q2a  nan   nan  Q2a 
    nan  nan  Q3d   nan  Q3d 
    nan  Q2c  nan   nan  Q2c 
1

Di seguito ha lavorato per me:

df = pd.DataFrame({'Q1': [1, None, None], 'Q2': [None, 2, None], 'Q3': [None, None, 3]}) 
df['Q'] = df.concat([df['Q1'], df['Q2'], df['Q3']]).dropna() 

Ci potrebbe essere una soluzione più elegante, ma questo è ciò che prima venuta in testa.

4

Utilizzo di column-saggio max() - vale a dire max(axis=1) - permetterebbe di comprimere tutti i valori in una sola colonna:

In [1]: import pandas as pd 

In [2]: df = pd.DataFrame({"Q1_Seen": ['Q1a', None, None, None], "Q2_Seen": [None, "Q2a", None, "Q2c"], "Q3_Seen": [None, None, "Q3d", None],"Q4_Seen": [None, None, None, None]}) 

In [3]: df 
Out[3]: 
    Q1_Seen Q2_Seen Q3_Seen Q4_Seen 
0  Q1a None None None 
1 None  Q2a None None 
2 None None  Q3d None 
3 None  Q2c None None 

In [4]: df['Q_Seen'] = df.max(axis=1) 

In [5]: df 
Out[5]: 
    Q1_Seen Q2_Seen Q3_Seen Q4_Seen Q_Seen 
0  Q1a None None None Q1a 
1 None  Q2a None None Q2a 
2 None None  Q3d None Q3d 
3 None  Q2c None None Q2c 
Problemi correlati