2017-02-25 4 views
1

Angenommen, ich habe ein Pandas Datenrahmen wie folgt aus:Generieren einer Kantenliste von einem Pandas Datenrahmen

Fruit_1 Fruit_2 Fruit_3 
0 Apple  Orange Peach 
1 Apple  Lemon Lime 
2 Starfruit Apple Orange 

reproduzierbarer Form:

df = pd.DataFrame([['Apple', 'Orange', 'Peach'], 
        ['Apple', 'Lemon', 'Lime'], 
        ['Starfruit', 'Apple', 'Orange']], 
        columns=['Fruit_1', 'Fruit_2', 'Fruit_3']) 

ich eine Kantenliste erstellt werden soll, die besteht aus:

Apple, Orange 
Apple, Peach 
Orange, Peach 
Apple, Lemon 
Apple, Lime 
Lemon, Lime 
Starfruit, Apple 
Starfruit, Orange 
Apple, Orange 

Wie mache ich es in Python?

Antwort

1

Ich weiß nicht, Pandas, aber sie itertools.combinations auf den Zeilen

itertools.combinations(row, 2) 

dies schafft einen Iterator verwenden könnte, die man einfach in eine Liste von Paaren umwandeln kann.

diese Listen Joining nach ihnen in einer Liste sammeln kann mit einer flachen Liste Verständnis

[pair for row in collected_rows for pair in row] 

Oder die Regel viel schneller numpy Weise

data[:, np.c_[np.tril_indices(data.shape[1], -1)]] 

Wenn Sie eine flache Liste wollen verwenden getan werden

data[:, np.c_[np.triu_indices(data.shape[1], 1)]].reshape(-1,2) 

Beachten Sie, dass triu_indices die v ertices in Reihenfolge, während tril_indices listet sie umgekehrt. Sie werden normalerweise verwendet, um die Indizes des oberen oder unteren Dreiecks einer Matrix zu erhalten.

+0

Nizza Lösung! – MaxU

+0

Das funktioniert! Vielen Dank! –

0

Hier ist eine Pandas Lösung:

In [118]: from itertools import combinations 

In [119]: df.apply(lambda x: list(combinations(x, 2)), 1).stack().reset_index(level=[0,1], drop=True).apply(', '.join) 
Out[119]: 
0  Apple, Orange 
1   Apple, Peach 
2  Orange, Peach 
3   Apple, Lemon 
4   Apple, Lime 
5   Lemon, Lime 
6  Starfruit, Apple 
7 Starfruit, Orange 
8  Apple, Orange 
dtype: object 
+0

Das funktioniert perfekt! Vielen Dank! –

+0

@KatieTruong, froh, ich könnte helfen. Bitte beachten Sie [akzeptieren] (http://meta.stackexchange.com/a/5235) die hilfreichste Antwort - dies zeigt auch an, dass Ihre Frage beantwortet wurde – MaxU

Verwandte Themen