Ubah bingkai data panda menjadi seri


99

Saya agak baru mengenal panda. Saya memiliki bingkai data panda yaitu 1 baris kali 23 kolom.

Saya ingin mengubahnya menjadi seri? Saya bertanya-tanya apa cara paling pythonic untuk melakukan ini?

Saya sudah mencoba pd.Series(myResults)tapi mengeluh ValueError: cannot copy sequence with size 23 to array axis with dimension 1. Tidaklah cukup pintar untuk menyadari bahwa itu masih merupakan "vektor" dalam istilah matematika.

Terima kasih!

Jawaban:


64

Tidaklah cukup pintar untuk menyadari bahwa itu masih merupakan "vektor" dalam istilah matematika.

Katakan bahwa itu cukup pintar untuk mengenali perbedaan dalam dimensi. :-)

Saya pikir hal paling sederhana yang dapat Anda lakukan adalah memilih baris itu secara posisional menggunakan iloc, yang memberi Anda Seri dengan kolom sebagai indeks baru dan nilai sebagai nilainya:

>>> df = pd.DataFrame([list(range(5))], columns=["a{}".format(i) for i in range(5)])
>>> df
   a0  a1  a2  a3  a4
0   0   1   2   3   4
>>> df.iloc[0]
a0    0
a1    1
a2    2
a3    3
a4    4
Name: 0, dtype: int64
>>> type(_)
<class 'pandas.core.series.Series'>

2
Atau, dengan cara lain:df.T
ako

14
@ako: df.Ttidak menghasilkan Seri, hanya DataFrame yang dialihkan.
DSM

@Tokopedia Itu benar, df.T.iloc [0]
Antonio Andrés

Satu-satunya masalah dengan penggunaan df.ilocadalah jika Anda memiliki df kosong, ini akan memunculkan IndexError. Untuk menghindarinya, setelah mentransposisi df Anda, gunakan df.squeezemetode ini. Ref. ke pandas.pydata.org/pandas-docs/stable/reference/api/…
Nicolas Fonteyne

60

Anda dapat mengubah urutan kerangka data baris tunggal (yang masih menghasilkan kerangka data) dan kemudian memeras hasilnya menjadi rangkaian (kebalikan dari to_frame).

df = pd.DataFrame([list(range(5))], columns=["a{}".format(i) for i in range(5)])

>>> df.T.squeeze()  # Or more simply, df.squeeze() for a single row dataframe.
a0    0
a1    1
a2    2
a3    3
a4    4
Name: 0, dtype: int64

Catatan: Untuk mengakomodasi poin yang dimunculkan oleh @IanS (meskipun tidak ada dalam pertanyaan OP), uji ukuran kerangka data. Saya berasumsi bahwa itu dfadalah kerangka data, tetapi kasus tepi adalah kerangka data kosong, kerangka data bentuk (1, 1), dan kerangka data dengan lebih dari satu baris dalam hal ini penggunaan harus mengimplementasikan fungsionalitas yang diinginkan.

if df.empty:
    # Empty dataframe, so convert to empty Series.
    result = pd.Series()
elif df.shape == (1, 1)
    # DataFrame with one value, so convert to series with appropriate index.
    result = pd.Series(df.iat[0, 0], index=df.columns)
elif len(df) == 1:
    # Convert to series per OP's question.
    result = df.T.squeeze()
else:
    # Dataframe with multiple rows.  Implement desired behavior.
    pass

Ini juga dapat disederhanakan sesuai dengan jawaban yang diberikan oleh @themachinist.

if len(df) > 1:
    # Dataframe with multiple rows.  Implement desired behavior.
    pass
else:
    result = pd.Series() if df.empty else df.iloc[0, :]

11
Perhatikan bahwa saya mengalami masalah kecil saat menggunakan squeeze. Untuk bentuk kerangka data, (1, 1)ia akan mengembalikan, bukan serangkaian panjang 1, tetapi skalar numpy. Hal ini menyebabkan bug yang sulit ditangkap saat menggunakan squeezeobjek yang panjangnya tidak diketahui (misalnya dengan groupby).
IanS

2
"Terima kasih! Df.squeeze () bekerja ketika df.iloc [:, 0] & df.ix [:, 0] keduanya menghasilkan terlalu banyak kesalahan indeks"
Afflatus

3
Dan mengapa kebalikan dari to_frametidak to_seriesatau pd.Series(df)...?
jhin

4
Anda tidak perlu.T
elgehelge

1
@IanS menyampaikan argumen df.squeeze(axis=0)atau df.squeeze(axis=1)(tergantung pada sumbu yang ingin Anda
simpan


4

Cara lain -

Misalkan myResult adalah dataFrame yang berisi data Anda berupa 1 col dan 23 baris

// label your columns by passing a list of names
myResult.columns = ['firstCol']

// fetch the column in this way, which will return you a series
myResult = myResult['firstCol']

print(type(myResult))

Dengan cara yang sama, Anda bisa mendapatkan rangkaian dari Dataframe dengan banyak kolom.


3

Anda juga dapat menggunakan stack ()

df= DataFrame([list(range(5))], columns = [“a{}”.format(I) for I in range(5)])

Setelah Anda menjalankan df, lalu jalankan:

df.stack()

Anda mendapatkan kerangka data Anda secara seri


0
data = pd.DataFrame({"a":[1,2,3,34],"b":[5,6,7,8]})
new_data = pd.melt(data)
new_data.set_index("variable", inplace=True)

Ini memberikan kerangka data dengan indeks sebagai nama kolom dari data dan semua data ada di kolom "nilai"


5
Selamat datang di Stack Overflow! Bagaimana ini menjawab pertanyaan? Kode Anda tidak mengembalikan Seri seperti pertanyaan yang diajukan
Gricey
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.