แปลงกรอบข้อมูลแพนด้าเป็นอนุกรม


98

ฉันค่อนข้างใหม่กับแพนด้า ฉันมีกรอบข้อมูลแพนด้าที่มี 1 แถวคูณ 23 คอลัมน์

ฉันต้องการแปลงเป็นซีรีส์หรือไม่ ฉันสงสัยว่าวิธีที่ยิ่งใหญ่ที่สุดในการทำเช่นนี้คืออะไร?

ฉันได้พยายามแต่ก็บ่นpd.Series(myResults) ValueError: cannot copy sequence with size 23 to array axis with dimension 1มันไม่ฉลาดพอที่จะรู้ว่ามันยังคงเป็น "เวกเตอร์" ในแง่คณิตศาสตร์

ขอบคุณ!

คำตอบ:


64

มันไม่ฉลาดพอที่จะรู้ว่ามันยังคงเป็น "เวกเตอร์" ในแง่คณิตศาสตร์

พูดแทนว่าฉลาดพอที่จะรับรู้ความแตกต่างของมิติข้อมูล :-)

ฉันคิดว่าสิ่งที่ง่ายที่สุดที่คุณทำได้คือเลือกแถวนั้นโดยใช้ตำแหน่งilocซึ่งจะทำให้คุณได้ซีรี่ส์ที่มีคอลัมน์เป็นดัชนีใหม่และค่าเป็นค่า:

>>> 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
หรืออีกวิธีหนึ่ง:df.T
ako

14
@ako: df.Tไม่ได้สร้างซีรี่ส์ แต่เป็นเพียง DataFrame ที่ถูกเปลี่ยน
DSM

@DSM. นั่นคือเรื่องจริง df.T.iloc [0]
Antonio Andrés

ปัญหาเดียวในการใช้df.ilocคือหากคุณมี df ว่างสิ่งนี้จะเพิ่มIndexErrorไฟล์. เพื่อหลีกเลี่ยงสิ่งนั้นหลังจากย้าย df ของคุณแล้วให้ใช้df.squeezeวิธีนี้ อ้างอิง to pandas.pydata.org/pandas-docs/stable/reference/api/…
Nicolas Fonteyne

60

คุณสามารถเปลี่ยนดาต้าเฟรมแถวเดียว (ซึ่งยังคงให้ผลลัพธ์เป็นดาต้าเฟรม) จากนั้นบีบผลลัพธ์ให้เป็นอนุกรม (ผกผันของ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

หมายเหตุ:เพื่อรองรับจุดที่ @IanS ยกขึ้น (แม้ว่าจะไม่อยู่ในคำถามของ OP) ให้ทดสอบขนาดของดาต้าเฟรม ฉันสมมติว่าdfเป็น dataframe แต่กรณี edge คือ dataframe ว่างดาต้าเฟรมของรูปร่าง (1, 1) และดาต้าเฟรมที่มีมากกว่าหนึ่งแถวซึ่งในกรณีนี้การใช้งานควรใช้ฟังก์ชันที่ต้องการ

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

นอกจากนี้ยังสามารถทำให้ง่ายขึ้นตามบรรทัดของคำตอบที่ @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
โปรดทราบว่าฉันพบปัญหาเล็กน้อยโดยใช้squeezeไฟล์. สำหรับ dataframe ของรูปร่าง(1, 1)จะส่งกลับไม่ใช่ชุดของความยาว 1 แต่เป็นสเกลาร์ที่เป็นตัวเลข สิ่งนี้นำไปสู่ข้อบกพร่องที่จับได้ยากเมื่อใช้squeezeกับวัตถุที่มีความยาวไม่ทราบสาเหตุ (เช่นกับgroupby)
IanS

2
"ขอบคุณ! df.squeeze () ทำงานเมื่อ df.iloc [:, 0] & df.ix [:, 0] เกิดข้อผิดพลาดดัชนีมากเกินไป"
Afflatus

3
แล้วทำไมผกผันของto_framenot to_seriesหรือpd.Series(df)... ?
jhin

4
คุณไม่ต้องการ.T
elgehelge

1
@IanS ส่งอาร์กิวเมนต์df.squeeze(axis=0)หรือdf.squeeze(axis=1)(ขึ้นอยู่กับแกนที่คุณต้องการอนุรักษ์) เพื่อหลีกเลี่ยงสิ่งนั้น
Nicolas Fonteyne

33

คุณสามารถดึงข้อมูลซีรีส์ผ่านการแบ่งส่วนดาต้าเฟรมของคุณโดยใช้หนึ่งในสองวิธีต่อไปนี้:

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

4

อีกวิธีหนึ่ง -

สมมติว่า myResult เป็น dataFrame ที่มีข้อมูลของคุณในรูปแบบ 1 col และ 23 แถว

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

ในทำนองเดียวกันคุณสามารถรับซีรีส์จาก Dataframe ที่มีหลายคอลัมน์ได้


3

คุณยังสามารถใช้ stack ()

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

หลังจากคุณเรียกใช้ df แล้วให้รัน:

df.stack()

คุณได้รับ dataframe เป็นชุด


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)

สิ่งนี้ทำให้ดาต้าเฟรมพร้อมดัชนีเป็นชื่อคอลัมน์ของข้อมูลและข้อมูลทั้งหมดจะอยู่ในคอลัมน์ "ค่า"


5
ยินดีต้อนรับสู่ Stack Overflow! สิ่งนี้ตอบคำถามได้อย่างไร? รหัสของคุณไม่ส่งคืนซีรี่ส์อย่างที่คำถามถาม
Gricey
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.