Menggabungkan dua Seri menjadi DataFrame di panda

278

Saya memiliki dua Seri s1dan s2dengan indeks yang sama (tidak berurutan). Bagaimana cara saya menggabungkan s1dan s2menjadi dua kolom dalam DataFrame dan menyimpan salah satu indeks sebagai kolom ketiga?

pengguna7289
sumber

Jawaban:

417

Saya pikir concatini cara yang bagus untuk melakukan ini. Jika ada, ia menggunakan atribut nama dari Seri sebagai kolom (jika tidak, nomornya saja):

In [1]: s1 = pd.Series([1, 2], index=['A', 'B'], name='s1')

In [2]: s2 = pd.Series([3, 4], index=['A', 'B'], name='s2')

In [3]: pd.concat([s1, s2], axis=1)
Out[3]:
   s1  s2
A   1   3
B   2   4

In [4]: pd.concat([s1, s2], axis=1).reset_index()
Out[4]:
  index  s1  s2
0     A   1   3
1     B   2   4

Catatan: Ini meluas ke lebih dari 2 Seri.

Andy Hayden
sumber
5
ini sebenarnya juga menghindari penyalinan (dibandingkan dengan solusi dict)
Jeff
Dalam satu contoh, sepertinya mengatakan kepada saya 'ValueError: Nilai kebenaran dari array dengan lebih dari satu elemen adalah ambigu. Gunakan a.any () atau a.all () '- ada ide?
user7289
@ user7289 tidak yakin dari mana datangnya, bisakah Anda menanyakan hal ini sebagai pertanyaan lain?
Andy Hayden
@AndyHayden: bagaimana jika ada duplikat di sepanjang satu atau kedua indeks?
Mannaggia
2
@dafinguzman apa yang "terus-menerus menggunakan kembali fungsi ini" berarti bahwa Anda harus lebih suka melakukan konser sekali pd.concat([list_of_dataframes]) vs concating berkali-kali new_df = pd.DataFrame(); for df in list_of_dsf: new_df = pd.concat([new_df, df])atau serupa.
Andy Hayden
38

Mengapa Anda tidak menggunakan .to_frame jika keduanya memiliki indeks yang sama?

> = v0.23

a.to_frame().join(b)

< v0.23

a.to_frame().join(b.to_frame())
swmfg
sumber
4
Mungkin ini akan lebih tepat: a.to_frame (name = 'a'). Join (b.to_frame (name = 'b'))
user3282777
33

Panda akan secara otomatis menyelaraskan ini berlalu dalam seri dan membuat indeks gabungan. Mereka kebetulan sama di sini. reset_indexmemindahkan indeks ke kolom.

In [2]: s1 = Series(randn(5),index=[1,2,4,5,6])

In [4]: s2 = Series(randn(5),index=[1,2,4,5,6])

In [8]: DataFrame(dict(s1 = s1, s2 = s2)).reset_index()
Out[8]: 
   index        s1        s2
0      1 -0.176143  0.128635
1      2 -1.286470  0.908497
2      4 -0.995881  0.528050
3      5  0.402241  0.458870
4      6  0.380457  0.072251
Jeff
sumber
16

Kode contoh:

a = pd.Series([1,2,3,4], index=[7,2,8,9])
b = pd.Series([5,6,7,8], index=[7,2,8,9])
data = pd.DataFrame({'a': a,'b':b, 'idx_col':a.index})

Panda memungkinkan Anda untuk membuat DataFramedari dictdengan Seriessebagai nilai dan nama kolom sebagai kunci. Ketika menemukan Seriessebagai nilai, ia menggunakan Seriesindeks sebagai bagian dari DataFrameindeks. Penyelarasan data ini adalah salah satu fasilitas utama Pandas. Akibatnya, kecuali Anda memiliki kebutuhan lain, yang baru dibuat DataFramememiliki nilai duplikat. Dalam contoh di atas, data['idx_col']memiliki data yang sama dengan data.index.

jbn
sumber
13

Jika saya dapat menjawab ini.

Dasar-dasar di balik konversi seri ke bingkai data adalah untuk memahami hal itu

1. Pada tingkat konseptual, setiap kolom dalam bingkai data adalah seri.

2. Dan, setiap nama kolom adalah nama kunci yang memetakan ke seri.

Jika Anda mengingat dua konsep di atas, Anda dapat memikirkan banyak cara untuk mengubah seri menjadi bingkai data. Satu solusi mudah akan seperti ini:

Buat dua seri di sini

import pandas as pd

series_1 = pd.Series(list(range(10)))

series_2 = pd.Series(list(range(20,30)))

Buat bingkai data kosong dengan hanya nama kolom yang diinginkan

df = pd.DataFrame(columns = ['Column_name#1', 'Column_name#1'])

Masukkan nilai seri ke dalam bingkai data menggunakan konsep pemetaan

df['Column_name#1'] = series_1

df['Column_name#2'] = series_2

Periksa hasil sekarang

df.head(5)
Sateesh
sumber
6

Tidak yakin saya sepenuhnya memahami pertanyaan Anda, tetapi apakah ini yang ingin Anda lakukan?

pd.DataFrame(data=dict(s1=s1, s2=s2), index=s1.index)

( index=s1.indexbahkan tidak perlu di sini)

Bertrand L
sumber
3

Penyederhanaan solusi berdasarkan join():

df = a.to_frame().join(b)
Lorenzo A. Rossi
sumber
1

Saya menggunakan panda untuk mengonversi array numpy atau iseries ke dataframe lalu menambahkan dan menambahkan kolom tambahan dengan kunci sebagai 'prediksi'. Jika Anda perlu dataframe dikonversi kembali ke daftar, maka gunakan values.tolist ()

output=pd.DataFrame(X_test)
output['prediction']=y_pred

list=output.values.tolist()     
Singa Emas
sumber