파이썬 pandas에서 복잡한 데이터 구조를 표현하는 방법은?
_____Q1. 중첩된(nested) JSON 데이터를 pandas로 불러오려면?
A1. pandas.io.json.json_normalize 함수를 이용해 중첩 구조를 ‘평탄화(flatten)’할 수 있습니다.
1) json_normalize(data, record_path=…, meta=…)
2) record_path에 리스트 경로, meta에 상위 필드 지정
3) 간단한 중첩→df = pd.json_normalize(my_json)
Q2. DataFrame 셀(cell)에 리스트나 딕셔너리를 그대로 저장할 수 있나요?
A2. 네. dtype=object 컬럼에 파이썬 리스트·딕셔너리를 저장할 수 있습니다.
- 예) df['tags'] = [['a','b'], ['c']]
- 필요한 시점에 explode(), apply(pd.Series) 등으로 다시 풀어 씁니다.
Q3. 리스트 컬럼을 여러 행으로 분리하려면?
A3. Series.explode() 메서드를 사용합니다.
- 예) df = df.explode('tags')
- explode는 리스트 항목마다 새로운 행을 생성
Q4. 딕셔너리 컬럼을 여러 칼럼으로 분리하려면?
A4. Series.apply(pd.Series) 또는 json_normalize를 씁니다.
- 예) df = pd.concat([df.drop('info',1), df['info'].apply(pd.Series)], axis=1)
Q5. 멀티인덱스(MultiIndex)로 복합 키를 표현하려면?
A5. DataFrame.set_index 또는 MultiIndex.from_tuples:
- df.set_index(['key1','key2'], inplace=True)
- cols = pd.MultiIndex.from_product([['A','B'], ['x','y']])
- df.columns = cols
Q6. 3차원 이상 N차원 구조를 다뤄야 한다면?
A6.
1) pandas.Panel은 deprecated → xarray 사용 권장
2) xarray.DataArray/Xarray.Dataset 은 N차원 배열을 라벨 축과 함께 다룸
3) 설치: pip install xarray
Q7. 사용자 정의 객체(custom class)나 복합 타입을 담으려면?
A7. dtype=object 컬럼에 저장 가능합니다.
- 성능 저하는 있을 수 있으므로 가급적 기본 타입(numpy, pandas 확장 타입) 사용 권장
A8. pandas 확장 타입 활용:
- pd.Categorical: 명목형/순서형 범주
- pd.IntervalIndex: 구간형 데이터
- pd.PeriodIndex: 기간형 (연도/분기/월)
Q9. 시계열 멀티인덱스로 시계열+그룹화 데이터를 표현하려면?
A9.
1) reset_index + set_index(['date','group'])
2) groupby(level=[0,1]) 나 unstack 사용
3) pivot_table(index='date', columns='group', values='value')
Q10. 복잡한 구조를 저장·공유하고 싶다면?
A10.
- Pickle: df.to_pickle / pd.read_pickle
- Parquet: df.to_parquet / pd.read_parquet (열 지향, 스키마 유지)
- HDF5: df.to_hdf / pd.read_hdf (대용량 지원)
- JSON: df.to_json(orient='records'/'table' 등)
Q11. 불규칙한 길이의 배열(jagged array)을 DataFrame으로 어떻게 다루나요?
A11.
1) object 컬럼에 리스트 형태로 보관
2) numpy array로 변환해도 되지만 길이가 달라질 땐 object 권장
3) 필요시 explode/apply로 변환
Q12. 복합 컬럼 이름(여러 단계) 처리 팁이 있나요?
A12.
- df.columns = ['_'.join(col).strip() for col in df.columns.values] (flatten)
- 혹은 swaplevel, sort_index(level=…) 로 재배치
Q13. 관계형 테이블처럼 여러 DataFrame을 조합하려면?
A13.
- merge/join: SQL 스타일 조인(1:1, 1:many)
- concat: axis=0/1 방향으로 이어붙이기
- combine_first: 누락값 채우기용
——
이상으로 pandas에서 복잡·중첩 구조를 표현·변환·저장하는 주요 방법들을 정리했습니다. 필요에 따라 평탄화(json_normalize), 멀티인덱스, 확장 데이터 타입, 외부 라이브러리(xarray) 등을 조합해 사용하세요.
복잡한 데이터 구조를 표현하는 방법에는 여러 가지가 있으며, 주로 DataFrame과 Series를 사용합니다.
아래에서 pandas를 사용하여 복잡한 데이터 구조를 표현하는 몇 가지 방법을 소개하겠습니다.
1. Hierarchical Indexing (다중 인덱스) 다중 인덱스를 사용하면 여러 수준의 인덱스를 만들어 복잡한 데이터 구조를 표현할 수 있습니다.
예를 들어, 다음은 여러 국가와 도시의 인구 데이터를 나타내는 DataFrame입니다.
```python import pandas as pd import numpy as np 데이터 생성 arrays = [['USA', 'USA', 'Canada', 'Canada'], ['New York', 'Los Angeles', 'Toronto', 'Vancouver']] index = pd.MultiIndex.from_arrays(arrays, names=('Country', 'City')) data = np.random.randint(1000, 10000, size=(4,)) df = pd.DataFrame(data, index=index, columns=['Population']) print(df) ```
2. Long Format vs Wide Format 복잡한 데이터 구조에서 데이터를 "long format" 또는 "wide format"으로 나타낼 수 있습니다.
이는 데이터의 차원과 관계를 표현하는 방법입니다.
`pd.melt()` 메소드를 사용하여 wide format을 long format으로 변환할 수 있습니다.
```python 데이터 준비 data = { 'Country': ['USA', 'USA', 'Canada', 'Canada'], 'City': ['New York', 'Los Angeles', 'Toronto', 'Vancouver'], '2010 Population': [8175133, 3792621, 2615055, 603502], '2020 Population': [8336817, 3980405, 2930000, 631486] } df_wide = pd.DataFrame(data) long format으로 변환 df_long = pd.melt(df_wide, id_vars=['Country', 'City'], value_vars=['2010 Population', '2020 Population'], var_name='Year', value_name='Population') print(df_long) ```
3. Grouping and Aggregation 복잡한 데이터에서 그룹별로 집계하여 새로운 데이터 구조를 만들 수 있습니다.
`groupby()` 메소드를 사용하여 데이터를 특정 조건으로 그룹화한 후, 통계량을 계산할 수 있습니다.
```python 예제 데이터 data = { 'Country': ['USA', 'USA', 'Canada', 'Canada'], 'City': ['New York', 'Los Angeles', 'Toronto', 'Vancouver'], 'Population': [8175133, 3792621, 2615055, 603502] } df = pd.DataFrame(data) Country별로 인구의 합계 계산 grouped = df.groupby('Country')['Population'].sum() print(grouped) ```
4. Time Series Data pandas는 시간 기반의 데이터를 다루는 데 매우 강력한 기능을 제공합니다.
`DatetimeIndex`를 사용하여 복잡한 시간 관련 데이터를 효과적으로 표현하고 분석할 수 있습니다.
```python 날짜 범위 생성 date_rng = pd.date_range(start='2023-01-01', end='2023-01-10', freq='D') 랜덤 데이터 생성 data = np.random.randint(0, 100, size=(len(date_rng),)) df_time_series = pd.DataFrame(data, index=date_rng, columns=['Data']) print(df_time_series) ```
5. Nested Data (중첩 데이터) pandas는 복잡한 중첩 구조(예: JSON 형식)도 처리할 수 있습니다.
`json_normalize()` 함수를 사용하여 중첩된 JSON 데이터를 평탄화할 수 있습니다.
```python import json 중첩 JSON 데이터 data = [ {"name": "John", "location": {"city": "New York", "state": "NY"}}, {"name": "Jane", "location": {"city": "Los Angeles", "state": "CA"}} ] JSON 데이터 평탄화 df_nested = pd.json_normalize(data) print(df_nested) ``` 이러한 방법을 통해 pandas를 사용하여 다양한 복잡한 데이터 구조를 효과적으로 표현할 수 있습니다.
각 방법은 데이터의 특성과 분석 목적에 따라 선택할 수 있습니다.
작성자:
이주희 [비회원]
| 작성일자: 1년 전
2025-02-10 05:31:31
조회수: 157 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
조회수: 157 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.