사전 목록을 panda DataFrame으로 변환
하면 좋을까요?DataFrame
★★★★
[{'points': 50, 'time': '5:00', 'year': 2010},
{'points': 25, 'time': '6:00', 'month': "february"},
{'points':90, 'time': '9:00', 'month': 'january'},
{'points_h1':20, 'month': 'june'}]
나는 위의 내용을 다른 것으로 바꾸고 싶다.DataFrame
:
month points points_h1 time year
0 NaN 50 NaN 5:00 2010
1 february 25 NaN 6:00 NaN
2 january 90 NaN 9:00 NaN
3 june NaN 20 NaN NaN
주의: 열의 순서는 중요하지 않습니다.
ifds
의 리스트입니다.dict
s:
df = pd.DataFrame(ds)
참고: 중첩된 데이터에서는 작동하지 않습니다.
사전 목록을 판다 데이터 프레임으로 변환하려면 어떻게 해야 합니까?
다른 답변은 맞지만, 이러한 방법의 장점과 한계점에 대해서는 많이 설명되지 않았습니다.이 투고의 목적은 다양한 상황에서 이러한 방법의 예를 보여주고, 언제 사용할지(사용하지 않을지)에 대해 논의하며, 대안을 제안하는 것입니다.
DataFrame()
, , 및
데이터의 구조와 형식에 따라 세 가지 방법이 모두 작동하거나 다른 방법보다 더 잘 작동하거나 전혀 작동하지 않는 경우가 있습니다.
매우 치밀한 예를 들어보자.
np.random.seed(0)
data = pd.DataFrame(
np.random.choice(10, (3, 4)), columns=list('ABCD')).to_dict('r')
print(data)
[{'A': 5, 'B': 0, 'C': 3, 'D': 3},
{'A': 7, 'B': 9, 'C': 3, 'D': 5},
{'A': 2, 'B': 4, 'C': 7, 'D': 6}]
이 목록은 존재하는 모든 키가 포함된 "레코드"로 구성됩니다.이것은 당신이 직면할 수 있는 가장 간단한 경우입니다.
# The following methods all produce the same output.
pd.DataFrame(data)
pd.DataFrame.from_dict(data)
pd.DataFrame.from_records(data)
A B C D
0 5 0 3 3
1 7 9 3 5
2 2 4 7 6
on Dictionary Orientations: 사전 오리엔테이션:orient='index'
/'columns'
계속하기 전에 다른 유형의 사전 방향을 구분하고 판다를 지원하는 것이 중요합니다."columns"와 "index"의 두 가지 주요 유형이 있습니다.
orient='columns'
한 DataFrame "의 열에 대응합니다.
를 들어, 「」라고 하는 것은,data
위는 "경계" 방향입니다.
data_c = [
{'A': 5, 'B': 0, 'C': 3, 'D': 3},
{'A': 7, 'B': 9, 'C': 3, 'D': 5},
{'A': 2, 'B': 4, 'C': 7, 'D': 6}]
pd.DataFrame.from_dict(data_c, orient='columns')
A B C D
0 5 0 3 3
1 7 9 3 5
2 2 4 7 6
" " 를하는 경우: " " " " 를 사용합니다.pd.DataFrame.from_records
의 방향은 「정렬」(다른 방법으로 지정할 수 없음)로 간주되어 사전이 그에 따라 로드됩니다.
orient='index'
이 방향에서 키는 인덱스 값에 해당하는 것으로 가정합니다. 종류의 적합하다.pd.DataFrame.from_dict
.
data_i ={
0: {'A': 5, 'B': 0, 'C': 3, 'D': 3},
1: {'A': 7, 'B': 9, 'C': 3, 'D': 5},
2: {'A': 2, 'B': 4, 'C': 7, 'D': 6}}
pd.DataFrame.from_dict(data_i, orient='index')
A B C D
0 5 0 3 3
1 7 9 3 5
2 2 4 7 6
이 케이스는 OP에서는 고려되지 않지만 알아두면 도움이 됩니다.
커스텀 인덱스 설정
DataFrame을 할 수 .index=...
★★★★★★ 。
pd.DataFrame(data, index=['a', 'b', 'c'])
# pd.DataFrame.from_records(data, index=['a', 'b', 'c'])
A B C D
a 5 0 3 3
b 7 9 3 5
c 2 4 7 6
은 는이 this this this this this 。pd.DataFrame.from_dict
.
키/컬럼 누락 대처
키/열 값이 누락된 사전을 처리할 때 모든 메서드가 즉시 작동합니다.예를들면,
data2 = [
{'A': 5, 'C': 3, 'D': 3},
{'A': 7, 'B': 9, 'F': 5},
{'B': 4, 'C': 7, 'E': 6}]
# The methods below all produce the same output.
pd.DataFrame(data2)
pd.DataFrame.from_dict(data2)
pd.DataFrame.from_records(data2)
A B C D E F
0 5.0 NaN 3.0 3.0 NaN NaN
1 7.0 9.0 NaN NaN NaN 5.0
2 NaN 4.0 7.0 NaN 6.0 NaN
열의 부분 집합 읽기
"모든 칼럼을 다 읽고 싶지 않으면 어떡해요?" 쉽게 할 수 .columns=...
파라미터를 지정합니다.
예를 들어, 사전의 예를 들어data2
위의 'A', 'D' 및 'F' 열만 읽으려면 목록을 전달하면 됩니다.
pd.DataFrame(data2, columns=['A', 'D', 'F'])
# pd.DataFrame.from_records(data2, columns=['A', 'D', 'F'])
A D F
0 5.0 3.0 NaN
1 7.0 NaN 5.0
2 NaN NaN NaN
이는 에서 지원되지 않습니다.pd.DataFrame.from_dict
기본 오리엔트 "default"를 사용합니다.
pd.DataFrame.from_dict(data2, orient='columns', columns=['A', 'B'])
ValueError: cannot use columns parameter with orient='columns'
행의 부분 집합 읽기
이러한 메서드에서는 직접 지원되지 않습니다.데이터를 반복하고 반복할 때 역방향 삭제를 수행해야 합니다.예를 들어, 0 행과nd 2 행만th 추출하려면data2
상기의 사용 방법:
rows_to_select = {0, 2}
for i in reversed(range(len(data2))):
if i not in rows_to_select:
del data2[i]
pd.DataFrame(data2)
# pd.DataFrame.from_dict(data2)
# pd.DataFrame.from_records(data2)
A B C D E
0 5.0 NaN 3 3.0 NaN
1 NaN 4.0 7 NaN 6.0
네스트된 데이터용 만병통치약:
위에서 설명한 방법에 대한 강력하고 강력한 대안은json_normalize
사전 목록(예: 사전)과 함께 작동하며 중첩된 사전도 처리할 수 있는 기능입니다.
pd.json_normalize(data)
A B C D
0 5 0 3 3
1 7 9 3 5
2 2 4 7 6
pd.json_normalize(data2)
A B C D E
0 5.0 NaN 3 3.0 NaN
1 NaN 4.0 7 NaN 6.0
다시 한 번 말씀드리지만 데이터가 전달된 것은json_normalize
는 List-of-Pariaries(표준) 형식이어야 합니다.
말씀드렸듯이json_normalize
는 중첩된 사전도 처리할 수 있습니다.다음은 설명서에서 인용한 예입니다.
data_nested = [
{'counties': [{'name': 'Dade', 'population': 12345},
{'name': 'Broward', 'population': 40000},
{'name': 'Palm Beach', 'population': 60000}],
'info': {'governor': 'Rick Scott'},
'shortname': 'FL',
'state': 'Florida'},
{'counties': [{'name': 'Summit', 'population': 1234},
{'name': 'Cuyahoga', 'population': 1337}],
'info': {'governor': 'John Kasich'},
'shortname': 'OH',
'state': 'Ohio'}
]
pd.json_normalize(data_nested,
record_path='counties',
meta=['state', 'shortname', ['info', 'governor']])
name population state shortname info.governor
0 Dade 12345 Florida FL Rick Scott
1 Broward 40000 Florida FL Rick Scott
2 Palm Beach 60000 Florida FL Rick Scott
3 Summit 1234 Ohio OH John Kasich
4 Cuyahoga 1337 Ohio OH John Kasich
에 대한 자세한 내용을 참조해 주세요.meta
그리고.record_path
인수, 매뉴얼을 참조해당 메뉴얼을 참조해 주세요.
정리
다음은 위에서 설명한 모든 방법과 지원되는 기능을 정리한 표입니다.
* 사용orient='columns'
전치해서 같은 효과를 얻습니다.orient='index'
.
팬더 16.2에서 저는pd.DataFrame.from_records(d)
이 일을 할 수 있게 말이야
를 사용할 수도 있습니다.pd.DataFrame.from_dict(d)
다음과 같이 합니다.
In [8]: d = [{'points': 50, 'time': '5:00', 'year': 2010},
...: {'points': 25, 'time': '6:00', 'month': "february"},
...: {'points':90, 'time': '9:00', 'month': 'january'},
...: {'points_h1':20, 'month': 'june'}]
In [12]: pd.DataFrame.from_dict(d)
Out[12]:
month points points_h1 time year
0 NaN 50.0 NaN 5:00 2010.0
1 february 25.0 NaN 6:00 NaN
2 january 90.0 NaN 9:00 NaN
3 june NaN 20.0 NaN NaN
Pyhton3:앞서 설명한 솔루션의 대부분은 동작하고 있습니다.단, 데이터 프레임의 row_number가 필요하지 않고 각 행(레코드)을 개별적으로 써야 하는 경우가 있습니다.
이 경우 다음 방법이 도움이 됩니다.
import csv
my file= 'C:\Users\John\Desktop\export_dataframe.csv'
records_to_save = data2 #used as in the thread.
colnames = list[records_to_save[0].keys()]
# remember colnames is a list of all keys. All values are written corresponding
# to the keys and "None" is specified in case of missing value
with open(myfile, 'w', newline="",encoding="utf-8") as f:
writer = csv.writer(f)
writer.writerow(colnames)
for d in records_to_save:
writer.writerow([d.get(r, "None") for r in colnames])
가장 쉬운 방법은 다음과 같습니다.
dict_count = len(dict_list)
df = pd.DataFrame(dict_list[0], index=[0])
for i in range(1,dict_count-1):
df = df.append(dict_list[i], ignore_index=True)
datetime 키와 int 값을 가진 다음 dits 목록이 있습니다.
list = [{datetime.date(2022, 2, 10): 7}, {datetime.date(2022, 2, 11): 1}, {datetime.date(2022, 2, 11): 1}]
위와 같은 방법으로 데이터 프레임으로 변환하는 데 문제가 있었습니다.날짜가 있는 컬럼이 있는 데이터 프레임이 생성되어...
솔루션:
df = pd.DataFrame()
for i in list:
temp_df = pd.DataFrame.from_dict(i, orient='index')
df = df.append(temp_df)
언급URL : https://stackoverflow.com/questions/20638006/convert-list-of-dictionaries-to-a-pandas-dataframe
'programing' 카테고리의 다른 글
기능 프로그래밍 - 불변성은 비용이 많이 드나요? (0) | 2023.01.10 |
---|---|
JSON의 RestTemplate를 통한 POST 요청 (0) | 2023.01.10 |
부동값이 정수인지 확인하는 방법 (0) | 2022.12.26 |
C에서는 마이너스 어레이 인덱스를 사용할 수 있습니까? (0) | 2022.12.26 |
Mysql 테이블의 필드 설명 표시 (0) | 2022.12.26 |