Konvertieren Sie Pandas-Serien in DataFrame

88

Ich habe eine Pandas-Serie sf:

email
email1@email.com    [1.0, 0.0, 0.0]
email2@email.com    [2.0, 0.0, 0.0]
email3@email.com    [1.0, 0.0, 0.0]
email4@email.com    [4.0, 0.0, 0.0]
email5@email.com    [1.0, 0.0, 3.0]
email6@email.com    [1.0, 5.0, 0.0]

Und ich möchte es in den folgenden DataFrame umwandeln:

index | email             | list
_____________________________________________
0     | email1@email.com  | [1.0, 0.0, 0.0]
1     | email2@email.com  | [2.0, 0.0, 0.0]
2     | email3@email.com  | [1.0, 0.0, 0.0]
3     | email4@email.com  | [4.0, 0.0, 0.0]
4     | email5@email.com  | [1.0, 0.0, 3.0]
5     | email6@email.com  | [1.0, 5.0, 0.0]

Ich habe einen Weg gefunden, aber ich bezweifle, dass es der effizientere ist:

df1 = pd.DataFrame(data=sf.index, columns=['email'])
df2 = pd.DataFrame(data=sf.values, columns=['list'])
df = pd.merge(df1, df2, left_index=True, right_index=True)
Woshitom
quelle
3
In neueren Versionen von Pandas kann dies mit einem einzigen reset_indexAufruf erreicht werden .
CS95

Antworten:

131

Anstatt zwei temporäre dfs zu erstellen, können Sie diese einfach als Parameter innerhalb eines Diktats mit dem DataFrame-Konstruktor übergeben:

pd.DataFrame({'email':sf.index, 'list':sf.values})

Es gibt viele Möglichkeiten, eine df zu erstellen, siehe die Dokumente

EdChum
quelle
Eine weitere großartige Option ist es, sich zu konzentrieren, wenn Ihre Serie die gleichen Achsen hatpd.concat([sf.index, sf.values], axis=1)
Lauren
63

einrahmen() :

Beginnend mit der folgenden Serie, df:

email
email1@email.com    A
email2@email.com    B
email3@email.com    C
dtype: int64

Ich benutze to_frame , um die Serie in DataFrame zu konvertieren:

df = df.to_frame().reset_index()

    email               0
0   email1@email.com    A
1   email2@email.com    B
2   email3@email.com    C
3   email4@email.com    D

Jetzt müssen Sie nur noch den Spaltennamen umbenennen und die Indexspalte benennen:

df = df.rename(columns= {0: 'list'})
df.index.name = 'index'

Ihr DataFrame ist zur weiteren Analyse bereit.

Update: Ich bin gerade auf diesen Link gestoßen, wo die Antworten meinen hier überraschend ähnlich sind.

Shoresh
quelle
1
series_obj.to_frame()funktioniert! Ich gebe diesen Klassentyp aus<class 'pandas.core.frame.DataFrame'>
Johnny Zhang
1
Warum to_frame().reset_index()eher als nur verwenden reset_index? Sie könnten sogar einfach tunreset_index(name='list')
Dumbledad
16

Eine Antwort wäre eine Zeile

myseries.to_frame(name='my_column_name')

Oder

myseries.reset_index(drop=True, inplace=True)  # As needed
Geheimnisvoll
quelle
15

Series.reset_indexmit nameArgument

Oft tritt der Anwendungsfall auf, in dem eine Serie zu einem DataFrame hochgestuft werden muss. Aber wenn die Serie keinen Namen hat, reset_indexführt dies zu etwas wie:

s = pd.Series([1, 2, 3], index=['a', 'b', 'c']).rename_axis('A')
s

A
a    1
b    2
c    3
dtype: int64

s.reset_index()

   A  0
0  a  1
1  b  2
2  c  3

Wo Sie sehen, ist der Spaltenname "0". Wir können dies beheben, indem wir einen nameParameter angeben.

s.reset_index(name='B')

   A  B
0  a  1
1  b  2
2  c  3

s.reset_index(name='list')

   A  list
0  a     1
1  b     2
2  c     3

Series.to_frame

Wenn Sie einen DataFrame erstellen möchten, ohne den Index in eine Spalte umzuwandeln, verwenden Sie Series.to_frame, wie in dieser Antwort vorgeschlagen . Dies auch unterstützt einen Namen Parameter.

s.to_frame(name='B')

   B
A   
a  1
b  2
c  3

pd.DataFrame Konstrukteur

Sie können auch das Gleiche tun, Series.to_frameindem Sie einen columnsParameter angeben:

pd.DataFrame(s, columns=['B'])

   B
A   
a  1
b  2
c  3
cs95
quelle
Ich habe mich gefragt, warum man to_framestattdessen verwenden könnte reset_index, aber gibt es jemals einen guten Grund, beide zu verwenden? hier
Dumbledad
@ Dumbledad meistens Dienstprogramm. Wenn Sie einen einzelnen col-Datenrahmen mit Index möchten, verwenden Sie to_frame (). Wenn Sie zwei Spalten benötigen (eine aus dem Serienindex und die andere aus den Serienwerten selbst), wählen Sie reset_index ().
CS95
Und was ist, wenn ich Serien in DataFrame konvertieren möchte, wobei der Seires-Index als DataFrame-Spaltennamen verwendet (dh transponiert) wird? to_framescheint kein Argument dafür zu haben. Vielen Dank.
Verwirrt
@Confounded benutze to_frame (). T, um es zu transponieren
cs95
4

Series.to_framekann verwendet werden, um ein Seriesin umzuwandeln DataFrame.

# The provided name (columnName) will substitute the series name
df = series.to_frame('columnName')

Beispielsweise,

s = pd.Series(["a", "b", "c"], name="vals")
df = s.to_frame('newCol')
print(df)

   newCol
0    a
1    b
2    c
Giorgos Myrianthous
quelle
1

wahrscheinlich als nicht-pythonische Methode eingestuft, aber dies ergibt das gewünschte Ergebnis in einer Zeile:

new_df = pd.DataFrame(zip(email,list))

Ergebnis:

               email               list
0   email1@email.com    [1.0, 0.0, 0.0]
1   email2@email.com    [2.0, 0.0, 0.0]
2   email3@email.com    [1.0, 0.0, 0.0]
3   email4@email.com    [4.0, 0.0, 3.0]
4   email5@email.com    [1.0, 5.0, 0.0]
Prathamesh Mistry
quelle