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.