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!
df.T
df.T
tidak menghasilkan Seri, hanya DataFrame yang dialihkan.df.iloc
adalah jika Anda memiliki df kosong, ini akan memunculkanIndexError
. Untuk menghindarinya, setelah mentransposisi df Anda, gunakandf.squeeze
metode ini. Ref. ke pandas.pydata.org/pandas-docs/stable/reference/api/…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
df
adalah 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, :]
sumber
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 menggunakansqueeze
objek yang panjangnya tidak diketahui (misalnya dengangroupby
).to_frame
tidakto_series
ataupd.Series(df)
...?.T
df.squeeze(axis=0)
ataudf.squeeze(axis=1)
(tergantung pada sumbu yang ingin AndaAnda dapat mengambil rangkaian dengan memotong kerangka data Anda menggunakan salah satu dari dua metode ini:
http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.iloc.html http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.loc.html
import pandas as pd import numpy as np df = pd.DataFrame(data=np.random.randn(1,8)) series1=df.iloc[0,:] type(series1) pandas.core.series.Series
sumber
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.
sumber
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:
Anda mendapatkan kerangka data Anda secara seri
sumber
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"
sumber