Pandas: Neue Spalten automatisch erstellen und mit Werten füllen

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
pytony
User
Beiträge: 25
Registriert: Mittwoch 14. Juni 2017, 11:26

Liebe alle,

ich habe eine Excel Tabelle mit den folgenden Spalten: Filename (Typ: Text), date_of_speech (Typ: Text), preprocessed_sentence_lda (Typ: Text; Ist vom Python Typ her eine Liste).

Nun habe ich in Gensim ein Topic-Model erstellt und will die Listen in preprocessed_sentence_lda analysieren.
Eine Liste sieht beispielsweise so aus:
['pleasure', 'conference', 'adoption', 'euro', 'day', 'euro', 'currency', 'circulation']

Nach Analyse einer Zeile in Excel (bzw. im Dataframe) durch Gensim erhalte ich folgendes Ergebnis:

[(0, 0.83270647275828491), (1, 0.16729352724171503)]

Es ist eine Liste mit Tupeln. Es kann natürlich sein, dass sich die Anzahl der Tupeln mit einem anderen Modell ändert. Je nach dem, ob es mehr oder weniger Topics gibt. Dabei
sind die Tupeln wie folgt aufgebaut: (Topic_Number, Topic_Probability). Es fängt für Number immer bei 0 an.

Was ich bisher unternommen habe ist, dass ich diese Tupeln erstmal in eine Dictionary umwandle:
{0: 0.8327064727582849, 1: 0.16729352724171503}

Die Frage ist nun:
Wie schaffe ich es, dass Pandas automatisch für jedes Key in der Dictionary eine gleichnamige Spalte erstellt und die zugehörigen Values in der richtigen Zelle einträgt?

Beispiel:

time preprocessed_sentence_lda Ergebnis (in dict umgewandelt;gerundet)
0 2013-01-01 ['pleasure', 'conference', 'adoption', 'euro', 'day', 'euro', 'currency', 'circulation'] {0: 0.83, 1: 0.17}
1 2013-01-02 ['progress', 'convergence', 'imbalance', 'account', 'balance', 'period', 'time'] {0: 0.55, 1: 0.45}
2 2013-01-03 ['context', 'process', 'deepening', 'place', 'country', 'development', 'investment'] {0: 0.87, 1: 0.13}


Mein Ziel ist:

time preprocessed_sentence_lda 0 1
0 2013-01-01 ['pleasure', 'conference', 'adoption', 'euro', 'day', 'euro', 'currency', 'circulation'] 0.83 0.17
1 2013-01-02 ['progress', 'convergence', 'imbalance', 'account', 'balance', 'period', 'time'] 0.55 0.45
2 2013-01-03 ['context', 'process', 'deepening', 'place', 'country', 'development', 'investment'] 0.87 0.13


EDIT: Leider ist hier die Formatierung der Tabelle zusammengebrochen, deswegen hier ein Screeni: Bild

Vielen lieben Dank im Voraus!

Grüße
pytony
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

schau mal ob dir das hier hilft

Code: Alles auswählen

import pandas as pd

data = [['2013-01-01', ['pleasure', 'conference', 'adoption', 'euro', 'day', 'euro', 'currency', 'circulation'], {0: 0.83, 1: 0.17}],
        ['2013-01-02', ['progress', 'convergence', 'imbalance', 'account', 'balance', 'period', 'time'], {0: 0.55, 1: 0.45}],
        ['2013-01-03', ['context', 'process', 'deepening', 'place', 'country', 'development', 'investment'], {0: 0.87, 1: 0.13}]]

df = pd.DataFrame(data, columns=['date', 'labels', 'gensim'])
gensim = pd.DataFrame([value for value in df.gensim.values])
df.drop('gensim', axis=1, inplace=True)
final = pd.concat([df, gensim], axis=1)
final

Code: Alles auswählen

        date  	        labels	                                                0	1
0	2013-01-01	[pleasure, conference, adoption, euro, day, eu...	0.83	0.17
1	2013-01-02	[progress, convergence, imbalance, account, ba...	0.55	0.45
2	2013-01-03	[context, process, deepening, place, country, ...	0.87	0.13
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
pytony
User
Beiträge: 25
Registriert: Mittwoch 14. Juni 2017, 11:26

Hallo Thomas!

Vielen lieben Dank für deine Hilfe. Du hast mir sehr geholfen!

Ich wünsche dir einen guten Abend!

Beste Grüße

pytony
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Wobei sich der Teil mit gensim noch verkürzen lässt zu:

Code: Alles auswählen

gensim = pd.DataFrame(list(df.gensim))
An der Stelle geht es ja eigentlich nur darum, die durch Pandas erzeugte Strukturierung zu ignorieren. Vielleicht gibt es da auch einen eleganteren Weg, der ohne die Liste auskommt. Ich wüsste das jetzt nicht auf Anhieb...
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

snafu hat geschrieben: Donnerstag 24. Januar 2019, 06:14 Wobei sich der Teil mit gensim noch verkürzen lässt zu:

Code: Alles auswählen

gensim = pd.DataFrame(list(df.gensim))
.
Danke snafu, manchmal denkt man einfach zu umständlich.
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

Besser tolist:

Code: Alles auswählen

pd.DataFrame(df.gensim.tolist())
und damit in einem Schritt:

Code: Alles auswählen

gensim = pd.DataFrame(df.pop('gensim').tolist())
Antworten