본문 바로가기
Programming/Python

좋은 재현 가능한 Pandas 예제를 만드는 방법

by Lunethan 2020. 12. 30.

SO에 적힌 pandas와 pandas 표지를 보면서 꽤 많은 시간을 보냈기 때문에, pandas 질문에는 재현 가능한 데이터가 포함될 가능성이 적다는 인상을 받았습니다. 이것은 R 커뮤니티가 장려하는데 꽤 좋은 역할을 해왔습니다. 그리고 이런 가이드들 덕분에, 새로 온 사람들은 이러한 사례들을 조합하는데 도움을 받을 수 있었습니다. 이러한 가이드를 읽고 재현 가능한 데이터를 가지고 돌아올 수 있는 사람들은 종종 질문에 대한 답을 얻는 데 훨씬 더 운이 좋을 것입니다.

어떻게 하면 pandas의 질문에 대한 좋은 재현 가능한 예를 만들 수 있을까요? 간단한 데이터 프레임은 다음과 같이 구성할 수 있습니다.

 

import pandas as pd
df = pd.DataFrame({'user': ['Bob', 'Jane', 'Alice'], 
                   'income': [40000, 50000, 42000]})

 

그러나 많은 예제 데이터셋에는 다음과 같은 보다 복잡한 구조가 필요합니다.

날짜/시간 색인 또는 데이터입니다.
다중 범주형 변수(일부 주어진 변수의 가능한 모든 조합을 생성하는 R의 expand.grid() 함수와 동일합니까?)
다중 인덱스 또는 패널 데이터입니다.
몇 줄의 코드를 사용하여 모사하기 어려운 데이터셋의 경우 복사 붙여넣기 가능한 코드를 생성하여 데이터 구조를 재생성할 수 있는 R의 dput()와 동등한 기능이 있습니까?

 

A: 

고지 사항: 좋은 질문을 쓰는 것은 어렵습니다.

좋은 예제:

실행 가능한 코드로 작은* 예제 DataFrame이 포함되어 있습니다.

In [1]: df = pd.DataFrame([[1, 2], [1, 3], [4, 6]], columns=['A', 'B'])

또는 pd.read_discount(discopy and pasteable)를 사용하여 스택 오버플로우 강조 표시 텍스트를 포맷하고 Ctrl+K(또는 각 줄에 네 개의 공백 추가)를 사용하거나 코드 위아래에 세 개의 타일을 들여쓰거나 코드 없이 붙여 넣을 수 있습니다.

In [2]: df
Out[2]: 
   A  B
0  1  2
1  1  3
2  4  6

 

직접 pd.read_discle(pd.read_s'\s\s+')을 테스트합니다.

* 정말 작다는 뜻입니다. 대부분의 예에서는 DataFramework가 필요한 6개 행의 인용문보다 적을 수 있으며 5개 행으로 실행할 수 있을 수 있습니다. 현재 직면하고 있는 문제를 나타내는 작은 데이터 프레임을 구성할 수 있는지 확인하기 위해 빈둥거리지 않는 경우, df df.head()로 오류를 재현할 수 있습니까?

* 모든 규칙에는 예외가 있습니다. 명백한 규칙은 성능 문제(경우에는 %time it 및 %prun 사용)에 대한 것이며 여기서 생성해야 합니다(np.random 사용 고려).seed를 사용하면 프레임이 동일합니다. df df pd.DataFrame(np.random.randn(1000000, 10))입니다. "내게 이 코드를 빠르게 만들기"라는 말은 사이트에 대한 주제가 아닙니다.

원하는 결과(위까지)를 기록합니다.

In [3]: iwantthis
Out[3]: 
   A  B
0  1  5
1  4  6

 

시도했던 코드를 표시합니다.

In [4]: df.groupby('A').sum()
Out[4]: 
   B
A   
1  5
4  6

하지만 틀린 것은 말하세요: A 열은 열이 아니라 인덱스에 있습니다.

 

몇 가지 조사(문서 검색, StackOverflow 검색)를 수행한 경우 요약 정보를 제공합니다.

합계를 위한 doc 문자열에는 "그룹 값의 계산 합계"라고 간단히 명시되어 있습니다.

문서별 그룹에는 이에 대한 예가 없습니다.

제쳐두고: 여기서 답은 df.groupby('A', as_index=False).sum()을()

타임스탬프 열이 있는 경우(예: 다시 샘플링하는 경우) 명시하고 pd.to_datetime을 올바른 측정**에 적용합니다.

 

df['date'] = pd.to_datetime(df['date']) # this column ought to be date..

 

나쁜 예제: 


복사하여 붙여넣을 수 없는 MultiIndex(다중 인덱스)는 포함하지 않습니다(위 참조). 이것은 Pandas의 기본 디스플레이에 대한 불만 사항이지만, 그럼에도 불구하고 성가신 일입니다.

In [11]: df
Out[11]:
     C
A B   
1 2  3
  2  6

 

올바른 방법은 set_index 호출과 함께 일반 DataFrame을 포함하는 것입니다.

 

In [12]: df = pd.DataFrame([[1, 2, 3], [1, 2, 6]], columns=['A', 'B', 'C']).set_index(['A', 'B'])

In [13]: df
Out[13]: 
     C
A B   
1 2  3
  2  6

 

원하는 결과를 제공할 때 어떤 것인지 파악할 수 있습니다.

 

   B
A   
1  1
5  0

 

숫자를 어떻게 얻었는지 구체적으로 말해보세요. 정답인지 다시 확인해 보세요.

코드가 오류를 발생시키는 경우 전체 스택 추적을 포함하십시오(너무 시끄러우면 나중에 편집할 수 있음). 라인 번호(및 코드 번호에 대해 증가되는 해당 라인)를 표시합니다.

 

못생긴 예제:

 

액세스 권한이 없는 csv에 링크하지 않습니다(외부 소스에 전혀 링크하지 않음...)

df = pd.read_csv('my_secret_file.csv')  # ideally with lots of parsing options

 

대부분의 데이터는 독점적입니다. 유사한 데이터를 구성하고 문제를 재현할 수 있는지 확인합니다.

큰 데이터 프레임이 있는 것처럼 상황을 말로 모호하게 설명하지 마십시오. 열 이름 중 일부를 전달(dtype은 언급하지 마십시오.) 실제 상황을 보지 않고서는 전혀 의미가 없는 것에 대해 많은 세부 사항을 살펴보도록 노력하세요. 아마도 아무도 이 단락의 끝까지 읽을 수 없을 것 같습니다.

에세이는 나쁘고, 작은 예시를 쓰는 것이 더 쉽습니다.

10+(100+?)를 포함하지 않습니다.) 실제 질문으로 넘어가기 전에 데이터 뭉킹 줄을 표시합니다.

제발요, 이런 일은 우리 일상에서 충분히 볼 수 있어요. 돕고 싶지만 이런 식으로는 안되요...
소개를 중단하고 문제를 일으키는 단계에서 관련 데이터 프레임(또는 소규모 버전)을 표시하십시오.

댓글