2015-06-17 15 views
5

Mam ramkę danych, w której niektóre kolumny wskazują, czy został wyświetlony zestaw pytań ankietowych. Na przykład:Scalenie wielu kolumn pandy w nowej kolumnie

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

Chciałbym zwinąć te kolumny w jednej kolumnie, powiedzmy Q_Seen, które przybierają formę:

Q_Seen 
    Q1a 
    Q2a 
    Q3d 
    Q2c 

Należy pamiętać, że każdy wiersz byłby wzajemnie się wykluczają: jeśli istnieje jest wartością w jednej z kolumn, wszystkie pozostałe to NaN.

Próbowałem to zrobić z pd.concat, ale wydawało się, że nie przynosi poprawnych wyników.

Odpowiedz

3

Spróbuj tego:

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

Następujące pracował dla mnie:

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() 

Nie może być bardziej eleganckie rozwiązanie, ale to, co pierwszy pojawiło się w mojej głowie.

4

Korzystanie kolumna mądry max() - tj max(axis=1) - pozwoli Ci rozwinąć wszystkie wartości w jednej kolumnie:

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 
Powiązane problemy