Konversikan Seri pandas ke DataFrame

92

Saya memiliki seri Pandas sf:

email
[email protected]    [1.0, 0.0, 0.0]
[email protected]    [2.0, 0.0, 0.0]
[email protected]    [1.0, 0.0, 0.0]
[email protected]    [4.0, 0.0, 0.0]
[email protected]    [1.0, 0.0, 3.0]
[email protected]    [1.0, 5.0, 0.0]

Dan saya ingin mengubahnya menjadi DataFrame berikut:

index | email             | list
_____________________________________________
0     | [email protected]  | [1.0, 0.0, 0.0]
1     | [email protected]  | [2.0, 0.0, 0.0]
2     | [email protected]  | [1.0, 0.0, 0.0]
3     | [email protected]  | [4.0, 0.0, 0.0]
4     | [email protected]  | [1.0, 0.0, 3.0]
5     | [email protected]  | [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)
woshitom
sumber
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

EdChum
sumber
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
[email protected]    A
[email protected]    B
[email protected]    C
dtype: int64

Saya menggunakan to_frame untuk mengonversi seri ke DataFrame:

df = df.to_frame().reset_index()

    email               0
0   [email protected]    A
1   [email protected]    B
2   [email protected]    C
3   [email protected]    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.

Shoresh
sumber
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
cs95
sumber
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
Gaib
sumber
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
Giorgos Myrianthous
sumber