Pandalar veri çerçevesini seriye dönüştür


99

Pandalar konusunda biraz yeniyim. 1 satıra 23 sütunluk bir panda veri çerçevem ​​var.

Bunu bir seriye dönüştürmek istiyorum? Bunu yapmanın en pitonik yolunun ne olduğunu merak ediyorum.

Denedim pd.Series(myResults)ama şikayet ediyor ValueError: cannot copy sequence with size 23 to array axis with dimension 1. Matematik açısından hala bir "vektör" olduğunu anlayacak kadar akıllı değil.

Teşekkürler!

Yanıtlar:


64

Matematik açısından hala bir "vektör" olduğunu anlayacak kadar akıllı değil.

Bunun yerine, boyutsallıktaki bir farkı tanıyacak kadar akıllı olduğunu söyleyin. :-)

Bence yapabileceğiniz en basit şey, kullanarak o satırı konumsal olarak seçmek iloc, bu da size yeni dizin olarak sütunların ve değerler olarak değerlerin bulunduğu bir Seri verir:

>>> 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
Veya başka bir şekilde:df.T
ako

14
@ako: df.Tbir Seri üretmez, sadece aktarılmış bir DataFrame.
DSM

@DSM. Bu doğru, df.T.iloc [0]
Antonio Andrés

Kullanmanın tek sorunu, df.ilocboş bir df'niz varsa, bunun bir IndexError. Bundan kaçınmak için, df'nizi değiştirdikten sonra df.squeezeyöntemi kullanın . Ref. için pandas.pydata.org/pandas-docs/stable/reference/api/...
Nicolas Fonteyne

61

Tek satırlı veri çerçevesini (yine de bir veri çerçevesiyle sonuçlanan) dönüştürebilir ve ardından sonuçları bir seriye sıkıştırabilirsiniz (tersi 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

Not: @IanS tarafından yükseltilen noktaya uyum sağlamak için (OP'nin sorusunda olmasa bile), veri çerçevesinin boyutunu test edin. Bunun dfbir veri çerçevesi olduğunu varsayıyorum , ancak kenar durumları boş bir veri çerçevesi, bir veri çerçevesi (1, 1) ve birden fazla satır içeren bir veri çerçevesi, bu durumda kullanım istenen işlevselliği uygulamalıdır.

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

Bu, @themachinist tarafından sağlanan cevabın satırları boyunca da basitleştirilebilir.

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

11
Kullanarak küçük bir sorunla karşılaştığımı unutmayın squeeze. Bir şekil veri çerçevesi (1, 1)için, bir dizi uzunluk 1 değil, ancak bir sayısal skaler dönecektir. Bu squeeze, bilinmeyen uzunluktaki nesnelerde (örneğin ile groupby) kullanıldığında yakalanması zor bir hataya yol açtı .
IanS

2
"Teşekkürler! Df.squeeze () çalıştı, df.iloc [:, 0] & df.ix [:, 0] her ikisi de çok fazla dizin hatası üretti"
Afflatus

3
Ve neden tersi to_framedeğil to_seriesveya pd.Series(df)...?
jhin

4
İhtiyacın yok.T
elgehelge

1
@IanS argümanı geçer df.squeeze(axis=0)veya df.squeeze(axis=1)(korumak istediğiniz eksene bağlı olarak) bundan kaçınmak için
Nicolas Fonteyne


4

Diğer yol -

MyResult'un verilerinizi 1 sütun ve 23 satır şeklinde içeren dataFrame olduğunu varsayalım

// 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))

Benzer şekilde, Dataframe'den birden çok sütunlu seriler alabilirsiniz.


3

Stack () işlevini de kullanabilirsiniz.

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

Df'yi çalıştırdıktan sonra şunu çalıştırın:

df.stack()

Veri çerçevenizi seri olarak elde edersiniz


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)

Bu, verilerin sütun adı olarak indeksi olan bir veri çerçevesi verir ve tüm veriler "değerler" sütununda bulunur


5
Stack Overflow'a hoş geldiniz! Bu soruya nasıl cevap veriyor? Soru gibi bir Series dönmez Kodunuz sorar
Gricey
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.