2015-12-19 17 views
7

Przyjmując następujące DataFrame.Pandy DataFrame stos wiele wartości kolumny do pojedynczej kolumny

key.0 key.1 key.2 topic 
1 abc def ghi  8 
2 xab xcd xef  9 

Jak mogę połączyć wartości wszystkich klawisza * kolumny w jeden „klucza” kolumny, która jest związana z tematem wartość odpowiadająca kluczowi. * kolumny? Jest to wynik chcę:

topic key 
1  8 abc 
2  8 def 
3  8 ghi 
4  9 xab 
5  9 xcd 
6  9 xef 

pamiętać, że liczba kolumn key.N jest zmienna na jakiejś zewnętrznej N.

Odpowiedz

12

można topić swoje dataframe:

>>> keys = [c for c in df if c.startswith('key.')] 
>>> pd.melt(df, id_vars='topic', value_vars=keys, value_name='key') 

    topic variable key 
0  8 key.0 abc 
1  9 key.0 xab 
2  8 key.1 def 
3  9 key.1 xcd 
4  8 key.2 ghi 
5  9 key.2 xef 

Daje również jesteś źródłem klucza.


Od v0.20, melt jest pierwsza klasa funkcją klasy pd.DataFrame:

>>> df.melt('topic', value_name='key').drop('variable', 1) 

    topic key 
0  8 abc 
1  9 xab 
2  8 def 
3  9 xcd 
4  8 ghi 
5  9 xef 
+0

prosty i bardzo szybki. Dziękuję Ci. – borice

2

Po wypróbowaniu różnych sposobów, uważam po to mniej lub bardziej intuicyjny, pod warunkiem stack „magia jest rozumiana :

# keep topic as index, stack other columns 'against' it 
stacked = df.set_index('topic').stack() 
# set the name of the new series created 
df = stacked.reset_index(name='key') 
# drop the 'source' level (key.*) 
df.drop('level_1', axis=1, inplace=True) 

Otrzymany dataframe jest wymagana:

topic key 
0  8 abc 
1  8 def 
2  8 ghi 
3  9 xab 
4  9 xcd 
5  9 xef 

Możesz chcieć wydrukować wyniki pośrednie, aby zrozumieć cały proces. Jeśli nie masz nic przeciwko posiadaniu większej liczby kolumn niż potrzeba, kluczowe kroki to: set_index('topic'), stack() i reset_index(name='key').

+0

Nie mogę znaleźć żadnej dokumentacji dotyczącej argumentu 'name' dla' reset_index', czy możesz wyjaśnić, jak to działa? – imp9

+0

to [Series.reset_index()] (http://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.reset_index.html?highlight=reset_index) – miraculixx

1

OK, ponieważ jedna z obecnych odpowiedzi jest oznaczona jako duplikat tego pytania, odpowiem tutaj.

Przez Korzystanie wide_to_long

pd.wide_to_long(df, ['key'], 'topic', 'age').reset_index().drop('age',1) 
Out[123]: 
    topic key 
0  8 abc 
1  9 xab 
2  8 def 
3  9 xcd 
4  8 ghi 
5  9 xef 
Powiązane problemy