Pandas 데이터 프레임을 시리즈로 변환


100

나는 팬더를 처음 접했습니다. 1 행 x 23 열의 팬더 데이터 프레임이 있습니다.

이것을 시리즈로 변환하고 싶습니까? 이 작업을 수행하는 가장 비단뱀적인 방법이 무엇인지 궁금합니다.

나는 시도 pd.Series(myResults)했지만 불평 ValueError: cannot copy sequence with size 23 to array axis with dimension 1합니다. 그것은 수학 용어에서 여전히 "벡터"라는 것을 깨닫기에 충분히 똑똑하지 않습니다.

감사!

답변:


64

그것은 수학 용어에서 여전히 "벡터"라는 것을 깨닫기에 충분히 똑똑하지 않습니다.

차라리 차원의 차이를 인식 할만큼 똑똑하다고 말하세요. :-)

가장 간단한 방법은를 사용하여 해당 행을 위치 적으로 선택하는 것 iloc입니다. 그러면 열이 새 인덱스로, 값이 값으로 포함 된 Series가 제공됩니다.

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

15
@ako : df.TSeries는 생성하지 않고 단지 전치 된 DataFrame입니다.
— DSM

@DSM. 맞습니다. df.T.iloc [0]
— Antonio Andrés

사용시 유일한 문제 df.iloc는 빈 df가 있으면 IndexError. 이를 방지하려면 df를 전치 한 후 df.squeeze방법을 사용하십시오 . Ref. to pandas.pydata.org/pandas-docs/stable/reference/api/…
— Nicolas Fonteyne

62

단일 행 데이터 프레임 (여전히 데이터 프레임이 생성됨)을 전치 한 다음 결과를 시리즈로 압축 할 수 있습니다 (의 역 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데이터 프레임 이라고 가정하고 있지만 가장자리 케이스는 빈 데이터 프레임, 모양 (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. 모양의 데이터 프레임의 (1, 1)경우 일련의 길이 1이 아니라 numpy 스칼라를 반환합니다. 이로 인해 squeeze길이를 알 수없는 객체 (예 :)에 사용할 때 잡기 어려운 버그가 발생했습니다 groupby.
— IanS

2
"감사합니다 () df.squeeze df.iloc 때 일 [: 0] df.ix [: 0] 모두 너무 많은 인덱스 오류를 생산!"
— 영감

4
그리고 왜 to_framenot to_series또는 pd.Series(df)... 의 반대 입니까?
— jhin

4
당신은 필요가 없습니다.T
— elgehelge

1
@IanS는 인수를 전달 df.squeeze(axis=0)하거나 df.squeeze(axis=1)(보존하려는 축에 따라)이를 방지하기 위해
— Nicolas Fonteyne


4

또 다른 방법 -

myResult가 1 열 및 23 행 형식의 데이터를 포함하는 dataFrame이라고 가정합니다.

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

일련의 데이터 프레임을 얻습니다.


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.