목록 목록에 Pandas DataFrame


115

목록 목록을 pandas 데이터 프레임으로 바꾸는 것은 쉽습니다.

import pandas as pd
df = pd.DataFrame([[1,2,3],[3,4,5]])

하지만 df를 목록 목록으로 되돌리려면 어떻게해야합니까?

lol = df.what_to_do_now?
print lol
# [[1,2,3],[3,4,5]]

답변:


177

기본 배열에 액세스하고 해당 tolist메서드를 호출 할 수 있습니다 .

>>> df = pd.DataFrame([[1,2,3],[3,4,5]])
>>> lol = df.values.tolist()
>>> lol
[[1L, 2L, 3L], [3L, 4L, 5L]]

L출력에 s가 추가 된 이유는 무엇 입니까?
Kunal Vyas

1
L은 int와 반대로 long을 의미합니다.
user48956 jul.


1
참고로 열 순서는 유지되지 않습니다. 그러니 조심하세요
Russell Lego

3
열 순서를 유지하지 않을 이유가 없습니다.
Yohan Obadia 19 년

15

데이터에 보존하려는 열 및 색인 레이블이있는 경우 몇 가지 옵션이 있습니다.

예제 데이터 :

>>> df = pd.DataFrame([[1,2,3],[3,4,5]], \
       columns=('first', 'second', 'third'), \
       index=('alpha', 'beta')) 
>>> df
       first  second  third
alpha      1       2      3
beta       3       4      5

tolist()다른 답변에서 설명하는 방법은 유용하지만 수익률 만 핵심 데이터 - 필요에 따라 충분하지 않을 수있다.

>>> df.values.tolist()
[[1, 2, 3], [3, 4, 5]]

한 가지 방법 DataFrame은를 사용하여 json 으로 변환 df.to_json()한 다음 다시 구문 분석하는 것입니다. 이것은 번거롭지 만 to_json()몇 가지 유용한 옵션이 있기 때문에 몇 가지 장점 이 있습니다.

>>> df.to_json()
{
  "first":{"alpha":1,"beta":3},
  "second":{"alpha":2,"beta":4},"third":{"alpha":3,"beta":5}
}

>>> df.to_json(orient='split')
{
 "columns":["first","second","third"],
 "index":["alpha","beta"],
 "data":[[1,2,3],[3,4,5]]
}

번거롭지 만 유용 할 수 있습니다.

좋은 소식은 열과 행에 대한 목록을 작성하는 것이 매우 간단하다는 것입니다.

>>> columns = [df.index.name] + [i for i in df.columns]
>>> rows = [[i for i in row] for row in df.itertuples()]

결과 :

>>> print(f"columns: {columns}\nrows: {rows}") 
columns: [None, 'first', 'second', 'third']
rows: [['alpha', 1, 2, 3], ['beta', 3, 4, 5]]

(가)의 경우 None인덱스의 이름을 귀찮은이기 때문에, 이름을 변경합니다 :

df = df.rename_axis('stage')

그때:

>>> columns = [df.index.name] + [i for i in df.columns]
>>> print(f"columns: {columns}\nrows: {rows}") 

columns: ['stage', 'first', 'second', 'third']
rows: [['alpha', 1, 2, 3], ['beta', 3, 4, 5]]

1
다중 레벨 인덱스가있는 경우 인덱스 튜플은 생성 된 행의 첫 번째 요소가됩니다. 분할하려면 추가 단계가 필요합니다.
Konstantin

그것은 사용하기 간단하지 않을까요 DataFrame.itertuples()또는 DataFrame.to_records()모든 하시나요?
AMC

@AMC 아마도, 모르겠어요, 어쩌면? 관용적이기보다는 자신의 대답에 그 생각에 대한 적절한 처리를 추가하는 것은 어떻습니까?
Andrew E

@AndrewE Eh, 기존 답변에 대해 논의하고 개선 할 가치가 있습니다.
AMC

5

귀하의 요구에 맞는지 모르겠지만 다음과 같이 할 수도 있습니다.

>>> lol = df.values
>>> lol
array([[1, 2, 3],
       [3, 4, 5]])

이것은 ndarray 모듈의 numpy 배열 일 뿐이며 일반적인 numpy 배열 작업을 모두 수행 할 수 있습니다.


1
Plus 1. 실제로 는 NumPy 배열을 목록 목록으로 변환 할 필요가 없습니다.
jpp

5

색인을 보존하고 싶었으므로이 솔루션에 대한 원래 답변을 수정했습니다.

list_df = df.reset_index().values.tolist()

이제 다른 곳에 붙여넣고 (예 : Stack Overflow 질문에 붙여 넣기) 후자는 다시 만들 수 있습니다.

pd.Dataframe(list_df, columns=['name1', ...])
pd.set_index(['name1'], inplace=True)

2

아마도 뭔가 변경되었지만 이것은 내가 필요한 것을 한 ndarrays 목록을 돌려주었습니다.

list(df.values)

1

참고 : Stack Overflow에서 Pandas Series 또는 DataFrame을 NumPy 배열 또는 일반 Python 목록으로 변환하는 것이 완전히 불필요한 경우를 많이 보았습니다. 라이브러리를 처음 사용하는 경우 필요한 기능이 이미 Pandas 개체에서 제공되는지 다시 확인하는 것이 좋습니다.

@jpp 의 주석 을 인용하려면 :

실제로 NumPy 배열을 목록 목록으로 변환 할 필요가없는 경우가 많습니다.


Pandas DataFrame / Series가 작동하지 않는 경우 기본 제공 DataFrame.to_numpySeries.to_numpy메서드를 사용할 수 있습니다 .


1
이 대답은 당신 자신의 신념에 불과합니다. 솔직히 말해서 좀 부끄럽습니다. 데이터 프레임을 목록 / 배열로 변환하는 데는 완전히 타당한 이유가 있습니다. 고급 사용자는 확실히 알 것입니다.
Nicolas Gervais

@NicolasGervais 너무 많을 수도 있습니다. 예, 덜 일반화하도록 편집하겠습니다. 데이터 프레임을 목록 / 배열로 변환하는 데는 완벽하게 타당한 이유가 있습니다. 물론 내 대답은 그 반대의 내용을 실제로 말하지 않습니다. 고급 사용자는 확실히 알 것입니다. 나는 그 잽의 요점을 보지 못합니다. 나는 많은 사람들이 시리즈를 ndarray 또는 목록으로, ndarray를 목록으로 변환하고 있다는 사실을 알게 된 후이 답변을 작성했습니다. 단순히 해당 개체가 지원하는 작업을 알지 못하기 때문입니다.
AMC

나는 for elem in some_series.values.tolist():시리즈의 요소를 반복 할 수 있다는 것을 모르기 때문에 하는 것과 같은 매우 노골적인 경우를 언급하고 있습니다. 이 답변에 대해 무엇이 그렇게 끔찍한 지 잘 모르겠습니다.
AMC

0

이것은 매우 간단합니다.

import numpy as np

list_of_lists = np.array(df)

DataFrame.values또는 사용 과 DataFrame.to_numpy()어떻게 다른 가요? 일반 Python 목록이 아닌 NumPy 배열을 생성한다는 사실은 신경 쓰지 마십시오.
AMC

-1

DataFrame.iterrows () 함수를 사용하여 주어진 Dataframe의 각 행을 반복하고 각 행의 데이터에서 목록을 구성 할 수 있습니다.

# Empty list 
row_list =[] 

# Iterate over each row 
for index, rows in df.iterrows(): 
    # Create list for the current row 
    my_list =[rows.Date, rows.Event, rows.Cost] 

    # append the list to the final list 
    row_list.append(my_list) 

# Print 
print(row_list) 

주어진 데이터 프레임의 각 행을 목록으로 성공적으로 추출 할 수 있습니다.


이것은 좋은 생각이 아닙니다. df.iterrows는 안티 패턴이고 df가 커지면 느리기 때문에 사용을 피하십시오. stackoverflow.com/questions/16476924/…
Derek O
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.