(row, col, values)의 튜플 목록에서 Pandas DataFrame을 생성합니다.


81

다음과 같은 튜플 목록이 있습니다.

data = [
('r1', 'c1', avg11, stdev11),
('r1', 'c2', avg12, stdev12),
('r2', 'c1', avg21, stdev21),
('r2', 'c2', avg22, stdev22)
]

첫 번째 열에 이름이 지정된 행과 두 번째 열에 이름이 지정된 열이있는 팬더 데이터 프레임에 넣고 싶습니다. 행 이름 pandas.DataFrame([x[1:] for x in data], index = [x[0] for x in data])을 처리하는 방법은 비슷 하지만 2x2 행렬을 얻기 위해 열을 어떻게 처리합니까 (이전 세트의 출력은 3x4)? 행 레이블을 명시 적으로 생략하는 대신 처리하는 더 지능적인 방법이 있습니까?

편집 2 개의 DataFrame이 필요한 것 같습니다. 하나는 평균 용이고 다른 하나는 표준 편차 용입니다. 맞습니까? 아니면 각 "셀"에 값 목록을 저장할 수 있습니까?


1
< stackoverflow.com/questions/11415701/… > 의 확실한 중복
ely

2
@EMS는 전혀 없습니다. 나는 그 질문을 보았고, 그는 2D 피벗이 필요하지 않았습니다.
gt6989b 2013

동의하지 않습니다. DataFrame에 데이터를 쌓는 올바른 방법에 익숙하지 않은 것 같습니다. 일반적으로 열 1과 열 2의 정보를 인덱스 로 사용하여 중 하나를 기준으로 빠르게 데이터를 검색 할 수 있습니다. 열 2의 항목은 열 이름으로 속하지 않지만, 그렇더라도 게시물 제목과는 완전히 별개의 질문입니다. 제목을 편집하는 것이 도움이 될 수 있다고 생각합니다 (여전히 의미있는 질문이 아니라고 생각합니다).
ely

1
@ely, 나는이이 이유는 명확하게하는 "(행 안부, 값)의 튜플의 목록에서"제목을 붙 gt6989b 중복하지 의 "튜플에서 ..."
SMCI

답변:


65

다음을 만든 후 DataFrame을 피벗 할 수 있습니다.

>>> df = pd.DataFrame(data)
>>> df.pivot(index=0, columns=1, values=2)
# avg DataFrame
1      c1     c2
0               
r1  avg11  avg12
r2  avg21  avg22
>>> df.pivot(index=0, columns=1, values=3)
# stdev DataFrame
1        c1       c2
0                   
r1  stdev11  stdev12
r2  stdev21  stdev22

3
인덱스 행 0이름과 열은 1매우 아름다운하지 않습니다 ...
drevicko

49

데이터를 그대로 쌓아 두는 것이 좋습니다.

df = pandas.DataFrame(data, columns=['R_Number', 'C_Number', 'Avg', 'Std'])

# Possibly also this if these can always be the indexes:
# df = df.set_index(['R_Number', 'C_Number'])

그런 다음 말하는 것이 조금 더 직관적입니다.

df.set_index(['R_Number', 'C_Number']).Avg.unstack(level=1)

이런 식으로 평균 또는 표준 편차를 재구성하려는 것이 암시 적입니다. 반면을 사용 pivot하는 것은 순전히 어떤 의미 엔티티인지에 대한 열 규칙을 기반으로합니다.


1
+1, 유용한 명시 성. 2D 테이블에 명시 적으로 관심이 있습니다. 행 및 열 목록으로 색인 된 값을 검색하고 각 차원에 개별적으로 액세스 할 수 있도록합니다. 스택 데이터로 그렇게 할 수 있습니까?
gt6989b 2013

2
네. 누적 데이터를 사용하면 훨씬 좋습니다. SQL과 같은 관계형 데이터베이스 테이블을 생각해보십시오. 전체 열을 반복되는 열 무리로 불어 내지 않겠습니까? 그것은 특별한 경우에만 발생해야합니다 (나는 그것이 길고 넓은 패턴이라고 생각합니다). 일반적으로 여러 열을 인덱스로 취급하고 인덱스 열 중 하나를 부분적으로 바인딩하거나 모두 바인딩하여 특정 레코드를 가져 와서 선택합니다.
ely

2
따라서 귀하의 경우 색인을로 설정 한 후 예를 들어 [R_Number, C_Number]할 수 있습니다 df.ix[('r1','c2')]. 또는 둘 다 일반 열로두고 논리적 인덱싱을 사용할 수 있습니다.df[(df.R_Number == 'r1') & (df.C_Number == 'c2')]
ely

2
일반적으로하려는 작업을 수행하는 주요 사용 사례 pivot는 화면에 멋지게 인쇄하거나 HTML, LaTeX 또는 .csv 등으로 멋지게 내보낼 수 있도록 일부 테이블의 서식을 지정할 때입니다. 프레젠테이션이나 기사 제출에 들어갈 표의 형식을 지정하는 것과 같습니다. 그렇지 않으면 데이터를 효율적으로 조작하는 한, 가능한 경우 (데이터베이스 테이블의 키와 같은) 다중 인덱스가되거나 적어도 반복되는 열이되도록하여 효율적인 인덱싱 및 조인 등을 수행 할 수 있습니다.하지만 그렇게하지 않습니다. 그들 자신의 기둥으로 날려 버리고 싶어요.
ely

35

이 질문에 왔을 때 예상했던 것입니다.

#!/usr/bin/env python

import pandas as pd


df = pd.DataFrame([(1, 2, 3, 4),
                   (5, 6, 7, 8),
                   (9, 0, 1, 2),
                   (3, 4, 5, 6)],
                  columns=list('abcd'),
                  index=['India', 'France', 'England', 'Germany'])
print(df)

준다

         a  b  c  d
India    1  2  3  4
France   5  6  7  8
England  9  0  1  2
Germany  3  4  5  6

질문을 잘못 읽었습니다. 질문에 원래 제공된 데이터에는 이미 문제의 각 레코드에 대한 행 및 열 레이블이 있습니다.
gt6989b dec

11
@ gt6989b 아니요,하지 않았습니다. 나는 원래의 질문에 대답하려고하지 않았지만 사람들이이 페이지를 방문했을 때 가질 수있는 질문입니다.
Martin Thoma 2017

8
@MartinThoma 감사합니다. 실제로 이것이 제가이 페이지에서 찾고있는 것입니다.
ssword
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.