일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 딥러닝
- 머신러닝
- 소프트웨어
- 2
- 네트워크
- 프로그래밍언어
- 웹개발
- 자료구조
- 파이썬
- 소프트웨어공학
- 자바스크립트
- 빅데이터
- 데이터구조
- 인공지능
- I'm Sorry
- 컴퓨터공학
- 네트워크보안
- 보안
- 프로그래밍
- 버전관리
- 데이터과학
- 컴퓨터과학
- 알고리즘
- Yes
- 컴퓨터비전
- 사이버보안
- 클라우드컴퓨팅
- 데이터베이스
- 코딩
- 데이터분석
- Today
- Total
스택큐힙리스트
판다스를 사용하여 딕셔너리 열을 분리/분해하여 개별 열로 만듭니다. 본문
저는 postgreSQL 데이터베이스에 저장된 데이터를 가지고 있습니다. 저는 Python 2.7을 사용하여 이 데이터를 조회하고 Pandas DataFrame으로 변환하고 있습니다. 그러나이 데이터 프레임의 마지막 열에는 값의 사전이 포함되어 있습니다. 데이터 프레임 df 은 다음과 같이 보입니다.
Station ID Pollutants
8809 {a: 46, b: 3, c: 12}
8810 {a: 36, b: 5, c: 8}
8811 {b: 2, c: 7}
8812 {c: 11}
8813 {a: 82, c: 15}
이 열을 별도의 열로 나눠야 합니다. 그래서 데이터프레임 `df2`가 다음과 같아지도록 해야 합니다.
Station ID a b c
8809 46 3 12
8810 36 5 8
8811 NaN 2 7
8812 NaN NaN 11
8813 82 NaN 15
제가 겪고 있는 주요 문제는 목록들이 길이가 같지 않다는 것입니다. 그러나 모든 목록은 'a', 'b', 'c'와 같은 최대 3개의 값만 포함합니다. 그리고 항상 같은 순서로 나타납니다 ('a'가 먼저, 'b'가 두 번째, 'c'가 세 번째).
다음 코드는 이전에 정상적으로 작동하여 내가 원하는 결과를 반환했습니다 (df2).
objs = [df, pandas.DataFrame(df['Pollutant Levels'].tolist()).iloc[:, :3]]
df2 = pandas.concat(objs, axis=1).drop('Pollutant Levels', axis=1)
print(df2)
저는 지난 주 이 코드를 실행했을 때 아주 잘 작동했습니다. 하지만 지금은 코드가 깨졌고, [4]번째 줄에서 이 오류가 발생합니다.
IndexError: out-of-bounds on slice (end)
코드에는 수정을 하지 않았지만 이제 오류가 발생합니다. 이는 내 방법이 충분히 견고하거나 적절하지 않아서인 것 같습니다.
이 리스트 열을 별도의 열로 분할하는 방법에 대한 제안이나 지도가 있다면 정말 감사하겠습니다!
편집: 내 코드에서 .tolist()와 .apply 방법이 작동하지 않는 것 같습니다. 즉, 하나의 유니코드 문자열입니다.
#My data format
u{'a': '1', 'b': '2', 'c': '3'}
#and not
{u'a': '1', u'b': '2', u'c': '3'}
이 형식으로 데이터가 postgreSQL 데이터베이스에서 가져옵니다. 이 문제에 대한 도움이나 아이디어가 있나요? 유니코드를 변환하는 방법이 있을까요?
답변 1
문자열을 실제 Dict로 변환하려면 df['Pollutant Levels'].map(eval)을(를) 실행할 수 있습니다. 그 후 아래의 솔루션을 사용하여 Dict를 다른 열로 변환할 수 있습니다.
작은 예제를 사용하여 .apply(pd.Series)를 사용할 수 있습니다.
In [2]: df = pd.DataFrame({'a':[1,2,3], 'b':[{'c':1}, {'d':3}, {'c':5, 'd':6}]})
In [3]: df
Out[3]:
a b
0 1 {u'c': 1}
1 2 {u'd': 3}
2 3 {u'c': 5, u'd': 6}
In [4]: df['b'].apply(pd.Series)
Out[4]:
c d
0 1.0 NaN
1 NaN 3.0
2 5.0 6.0
나머지 데이터프레임과 결합하기 위해서는 위 결과와 다른 열들을 concat하여 결합할 수 있습니다.
In [7]: pd.concat([df.drop(['b'], axis=1), df['b'].apply(pd.Series)], axis=1)
Out[7]:
a c d
0 1 1.0 NaN
1 2 NaN 3.0
2 3 5.0 6.0
당신의 코드를 사용하면, iloc 부분을 빼도 이것도 작동합니다:
In [15]: pd.concat([df.drop('b', axis=1), pd.DataFrame(df['b'].tolist())], axis=1)
Out[15]:
a c d
0 1 1.0 NaN
1 2 NaN 3.0
2 3 5.0 6.0
답변 2
Pandas를 사용하여 딕셔너리 열을 분할 / 분할하여 별도의 열로 만들어 보자.판다스는 파이썬에서 가장 인기 있는 데이터 분석 라이브러리 중 하나입니다. 이 라이브러리는 대규모 데이터 집합을 처리하고 분석하는 데 사용됩니다. 오늘은 pandas를 사용하여 딕셔너리 열을 분할 / 분할하여 별도의 열로 만드는 방법을 살펴볼 것입니다.
우선, pandas 라이브러리를 불러와야 합니다. pandas를 사용하려면 일반적으로 pandas를 pd로 임포트합니다.
``` python
import pandas as pd
```
다음으로, pandas로 데이터를로드하고 딕셔너리 열을 만들어야 합니다. 이 예제에서는 다음과 같은 딕셔너리를 사용할 것입니다.
``` python
data = {name: [John Doe, Jane Smith],
score: [{math: 90, science: 80}, {math: 85, science: 95}],
gender: [M, F]}
df = pd.DataFrame(data)
print(df)
```
위 코드는 다음과 같은 출력을 생성합니다.
```
name score gender
0 John Doe {'math': 90, 'science': 80} M
1 Jane Smith {'math': 85, 'science': 95} F
```
이제, 'score'열을 분할하고 내부 딕셔너리 키가 새로운 열로 만들어진 데이터 프레임을 만들어 보겠습니다.
``` python
df_scores = pd.DataFrame(df[score].to_dict()).transpose()
df_scores.columns = [score_math, score_science]
df_new = pd.concat([df.iloc[:, 0:1], df_scores, df.iloc[:, 2:]], axis=1)
print(df_new)
```
위 코드는 다음과 같은 출력을 생성합니다.
```
name score_math score_science gender
0 John Doe 90 80 M
1 Jane Smith 85 95 F
```
이제 'score' 열이 분할되고 내부 딕셔너리 키가 새로운 열로 만들어졌습니다.
이렇게 pandas를 사용하여 딕셔너리 열을 분할 / 분할하여 별도의 열로 만드는 것이 가능합니다. 이 기능을 사용하면 복잡한 데이터를 쉽게 처리하고 분석할 수 있습니다. Pandas는 데이터 분석 작업을 간단하고 효율적으로 수행하는 것에 큰 도움이 됩니다.