2014-03-12 2 views
3

date 열을 색인으로 사용하고 세 가지 열 x, yz이있는 데이터 프레임을 고려해야합니다. 이 데이터 프레임의 내용을 .csv 파일에 쓰고 싶습니다. 내가 이것에 대해 df.to_csv을 사용할 수 있다는 것을 알고 있지만, 유닛에 두 번째 헤더 행을 추가하고 싶습니다. 이 예에서 원하는 .csv 파일은 다음과 같이 표시됩니다.팬더 to_csv()를 사용하여 여러 헤더 행과 함께 CSV 파일을 작성하려면 어떻게해야합니까?

date,x,y,z 
(yyyy-mm-dd),(s),(m),(kg) 
2014-03-12,1,2,3 
2014-03-13,4,5,6 
... 
+0

아마도 보통 파이썬 출력 (file.write())을 사용하여 첫 번째 줄을 쓴 다음 그 아래에 단위 줄이있는 데이터 프레임을 헤더에 쓸 수 있습니다. (이 방법이 작동하는지 여부는 모르지만 수행 방법은 다를 수 있습니다.) –

+0

처음에는 "두 번째"헤더와 함께 새 행을 삽입하는 것과 어떻게 다른가요? – Ben

+0

@Ben : 인덱스 문자열을 사용하여 어떻게 처리 할 수 ​​있습니까 (datetime-index가 있나요?). 나는'df.loc()'을 사용하여 시도했지만 분명히 문법이 잘못되었습니다. (항상 ValueError : 키가 yyyy-mm-dd 인 DatetimeIndex 인덱스에 안전하지 않은 오류가 발생합니다.) –

답변

3

이 예에서는 정확한 결과가 나오지 않지만 거의 비슷합니다. 당신은 열 레이블로 두 번째 헤더 (단위) 저장하는 멀티 인덱스 컬럼을 사용할 수 있습니다

>>> import pandas as pd 
>>> columns = pd.MultiIndex.from_tuples(
...  zip(['date', 'x', 'y', 'z'], 
...   ['(yyyy-mm-dd)', '(s)', '(m)', '(kg)'])) 
>>> data = [['2014-03-12', 1, 2, 3], 
...   ['2014-03-13', 4, 5, 6]] 
>>> df = pd.DataFrame(data, columns=columns) 
>>> df 
      date x y z 
    (yyyy-mm-dd) (s) (m) (kg) 
0 2014-03-12 1 2 3 
1 2014-03-13 4 5 6 

이 방법은 당신의 열이 올바른 유형을 유지할 수 있습니다 두 번째 헤더를 저장 (예, 열 x는이어야한다 정수형) :

당신이 DataFrame로 두 번째 헤더를 저장 한 경우
>>> df.dtypes 
date (yyyy-mm-dd) object 
x  (s)    int64 
y  (m)    int64 
z  (kg)    int64 
dtype: object 

, 당신의 열 dtypes 당신은 아마하지 않을 object을 될 것입니다.

쓰기 형식이 예와 매우 비슷한 생산 DataFrame CSV의 :

>>> df.to_csv('out.csv', index=False) 
>>> !cat out.csv 
date,x,y,z 
(yyyy-mm-dd),(s),(m),(kg) 
,,, 
2014-03-12,1,2,3 
2014-03-13,4,5,6 

유일한 차이점은 쉼표의 추가 라인은, 팬더는 데이터의 실제 행에서 다중 행 헤더를 분리하는 방법이다 . 이것은 CSV는 해당 DataFrame로 다시 읽을 수 파일 허용 :

>>> df2 = pd.read_csv('out.csv', header=[0, 1]) 
>>> df2 
      date x y z 
    (yyyy-mm-dd) (s) (m) (kg) 
0 2014-03-12 1 2 3 
1 2014-03-13 4 5 6 

참고 : 나는 this SO question 곳곳에이 정보를 많이 발견했다.

관련 문제