Python, JSON, Pandas를 사용하여 딕셔너리 열을 여러 열로 분할/분해하기
데이터 준비
먼저 다음과 같은 JSON 데이터를 가진 DataFrame을 만들어 봅시다.
import pandas as pd
data = {
"name": ["Alice", "Bob", "Carol"],
"data": [
{"age": 20, "city": "Seoul"},
{"age": 30, "city": "New York"},
{"age": 25, "city": "London"},
]
}
df = pd.DataFrame(data)
print(df)
# name data
# 0 Alice {'age': 20, 'city': 'Seoul'}
# 1 Bob {'age': 30, 'city': 'New York'}
# 2 Carol {'age': 25, 'city': 'London'}
apply 함수 사용
apply
함수를 사용하여 딕셔너리 열을 각 행에 대해 반복하고 각 딕셔너리 키-값 쌍을 새 열로 변환할 수 있습니다.
def g(x):
return pd.Series(x)
df = df.join(df["data"].apply(g))
print(df)
# name age city
# 0 Alice 20 Seoul
# 1 Bob 30 New York
# 2 Carol 25 London
json_normalize 함수 사용
json_normalize
함수는 JSON 데이터를 Pandas DataFrame으로 변환하는 데 유용한 함수입니다.
from pandas.io.json import json_normalize
df = df.join(json_normalize(df["data"]))
print(df)
# name age city
# 0 Alice 20 Seoul
# 1 Bob 30 New York
# 2 Carol 25 London
람다 함수 사용
람다 함수를 사용하여 간단하게 코드를 작성할 수 있습니다.
df = df.join(df["data"].apply(lambda x: pd.Series(x)))
print(df)
# name age city
# 0 Alice 20 Seoul
# 1 Bob 30 New York
# 2 Carol 25 London
for 루프 사용
for 루프를 사용하여 직접 딕셔너리 열을 분할할 수도 있습니다.
for i in range(len(df)):
row = df.loc[i, :]
data = row["data"]
for key, value in data.items():
df.loc[i, key] = value
df.drop(columns=["data"], inplace=True)
print(df)
# name age city
# 0 Alice 20 Seoul
# 1 Bob 30 New York
# 2 Carol 25 London
예제 코드
import pandas as pd
data = {
"name": ["Alice", "Bob", "Carol"],
"data": [
{"age": 20, "city": "Seoul"},
{"age": 30, "city": "New York"},
{"age": 25, "city": "London"},
]
}
df = pd.DataFrame(data)
# 1. `apply` 함수 사용
def g(x):
return pd.Series(x)
df = df.join(df["data"].apply(g))
# 2. `json_normalize` 함수 사용
from pandas.io.json import json_normalize
df = df.join(json_normalize(df["data"]))
# 3. 람다 함수 사용
df = df.join(df["data"].apply(lambda x: pd.Series(x)))
# 4. for 루프 사용
for i in range(len(df)):
row = df.loc[i, :]
data = row["data"]
for key, value in data.items():
df.loc[i, key] = value
df.drop(columns=["data"], inplace=True)
print(df)
# name age city
# 0 Alice 20 Seoul
# 1 Bob 30 New York
# 2 Carol 25 London
참고:
df.dtypes
명령어를 사용하여 DataFrame의 각 열의 데이터 유형을 확인할 수 있습니다.df.to_csv("filename.csv")
명령어를 사용하여 DataFrame을 CSV 파일로 저장할 수 있습니다.
딕셔너리 열 분할/분해를 위한 대체 방법
DataFrame.from_dict 함수 사용
DataFrame.from_dict
함수를 사용하여 딕셔너리 데이터를 DataFrame으로 변환할 수 있습니다.
df = pd.DataFrame.from_dict(data["data"], orient="index")
df.columns = ["age", "city"]
print(df)
# age city
# 0 20 Seoul
# 1 30 New York
# 2 25 London
dict comprehension 사용
dict comprehension
을 사용하여 딕셔너리 열을 새로운 딕셔너리로 변환하고,
new_data = {key: value for row in df["data"] for key, value in row.items()}
df = df.join(pd.DataFrame(new_data))
df.drop(columns=["data"], inplace=True)
print(df)
# name age city
# 0 Alice 20 Seoul
# 1 Bob 30 New York
# 2 Carol 25 London
stack and unstack 함수 사용
stack
함수를 사용하여 딕셔너리 열을 여러 행으로 변환하고, unstack
함수를 사용하여
df = df.join(df["data"].stack())
df = df.unstack(fill_value=-11414)
df.drop(columns=["data"], inplace=True)
print(df)
# name age city
# 0 Alice 20 Seoul
# 1 Bob 30 New York
# 2 Carol 25 London
zip 함수 사용
zip
함수를 사용하여 딕셔너리 값을 여러 열로 변환할 수 있습니다.
ages, cities = zip(*[row["data"].values() for row in df.itertuples()])
df["age"] = ages
df["city"] = cities
df.drop(columns=["data"], inplace=True)
print(df)
# name age city
# 0 Alice 20 Seoul
# 1 Bob 30 New York
# 2 Carol 25 London
다양한 방법들이 존재하며, 상황에 따라 적절한 방법을 선택하는 것이 중요합니다.
- 위 코드는 예시이며, 실제 상황에 맞게 수정해야 할 수도 있습니다.
- 코드를 실행하기 전에 데이터 유형과 구조를 확인하세요.
python json pandas