Konversikan Seri pandas ke DataFrame


92

Saya memiliki seri Pandas 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]

Dan saya ingin mengubahnya menjadi DataFrame berikut:

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]

Saya menemukan cara untuk melakukannya, tetapi saya ragu cara ini lebih efisien:

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)

4
Dalam versi panda yang lebih baru, hal ini dapat dilakukan dengan satu reset_indexpanggilan .
cs95

Jawaban:


137

Daripada membuat 2 df sementara Anda bisa meneruskan ini sebagai params dalam sebuah dict menggunakan konstruktor DataFrame:

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

Ada banyak cara untuk membuat df, lihat dokumennya


Pilihan bagus lainnya adalah menyimpulkan jika seri Anda memiliki sumbu yang samapd.concat([sf.index, sf.values], axis=1)
Lauren

63

to_frame () :

Dimulai dengan Seri berikut, df:

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

Saya menggunakan to_frame untuk mengonversi seri ke DataFrame:

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

Sekarang yang Anda butuhkan hanyalah mengganti nama kolom dan memberi nama kolom indeks:

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

DataFrame Anda siap untuk analisis lebih lanjut.

Pembaruan: Saya baru saja menemukan tautan ini di mana jawabannya sangat mirip dengan saya di sini.


1
series_obj.to_frame()berhasil! Saya mengeluarkan tipe kelas ini<class 'pandas.core.frame.DataFrame'>
Johnny Zhang

1
Mengapa menggunakan to_frame().reset_index()daripada hanya reset_index? Anda bahkan bisa melakukannyareset_index(name='list')
dumbledad

17

Series.reset_indexdengan nameargumen

Seringkali muncul kasus penggunaan di mana Seri perlu dipromosikan ke DataFrame. Tetapi jika Seri tidak memiliki nama, maka reset_indexakan menghasilkan sesuatu seperti,

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

Di mana Anda melihat nama kolom adalah "0". Kita dapat memperbaikinya dengan menentukan nameparameter.

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

Jika Anda ingin membuat DataFrame tanpa mempromosikan indeks ke kolom, gunakan Series.to_frame, seperti yang disarankan dalam jawaban ini . Ini juga mendukung parameter nama.

s.to_frame(name='B')

   B
A   
a  1
b  2
c  3

pd.DataFrame Pembuat

Anda juga dapat melakukan hal yang sama Series.to_framedengan menentukan columnsparameter:

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

   B
A   
a  1
b  2
c  3

Saya bertanya-tanya mengapa seseorang mungkin menggunakan to_framealih-alih reset_index, tetapi apakah ada alasan bagus untuk menggunakan keduanya? di sini
dumbledad

@Dledled sebagian besar utilitas. Jika Anda menginginkan satu kolom dataframe dengan indeks, gunakan to_frame (). Jika Anda membutuhkan dua kolom (satu dari indeks seri dan yang lainnya dari nilai seri itu sendiri), gunakan reset_index ().
cs95

Dan bagaimana jika saya ingin mengubah Seri ke DataFrame dengan indeks Seires yang digunakan sebagai nama kolom DataFrame (yaitu dialihkan)? to_frametampaknya tidak memiliki alasan untuk melakukan ini. Terima kasih.
Bingung

@Confounded gunakan to_frame (). T untuk mengubahnya
cs95

17

Jawaban satu baris adalah

myseries.to_frame(name='my_column_name')

Atau

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

4

Series.to_framedapat digunakan untuk mengkonversi Serieske DataFrame.

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

Sebagai contoh,

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

   newCol
0    a
1    b
2    c

1

mungkin dinilai sebagai cara non-pythonic untuk melakukan ini, tetapi ini akan memberikan hasil yang Anda inginkan dalam satu baris:

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

Hasil:

               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]
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.