python pandas 데이터 프레임을 사전으로


111

두 개의 열 데이터 프레임이 있고이를 파이썬 사전으로 변환하려고합니다. 첫 번째 열은 키가되고 두 ​​번째 열은 값이됩니다. 미리 감사드립니다.

데이터 프레임 :

    id    value
0    0     10.2
1    1      5.7
2    2      7.4



4
@perigee : 질문이 해결 된 것으로 표시하기 위해 (도움이되는 경우) 답변 중 하나를 수락 할 수 있습니까? 이것은 다른 사용자에게도 도움이 될 것입니다.
MERose

색인과 일치하는 ID가있는 경우 색인으로 설정해야합니다.
Faris

답변:


152

에 대한 문서를 참조하십시오 to_dict. 다음과 같이 사용할 수 있습니다.

df.set_index('id').to_dict()

그리고 열이 하나만있는 경우 열 이름이 dict의 수준이되는 것을 방지하기 위해 (실제로이 경우)를 사용합니다 Series.to_dict().

df.set_index('id')['value'].to_dict()

14
이 명령은 ID 열 거기에 중복 값의 경우 데이터를 잃게됩니다 참고 >>> ptest = p.DataFrame([['a',1],['a',2],['b',3]], columns=['id', 'value']) >>> ptest.set_index('id')['value'].to_dict()
dalloliogm

9
이 질문에 대한 답을 줄 문서 링크에는 아무것도 없습니다.
Ben Fulton

@bombayquant는 아래의 DSM과 내 답변을 참조하십시오. 이것은 4 년 된 토론입니다.
dalloliogm

66
mydict = dict(zip(df.id, df.value))

1
참고 : 색인이 원하는 사전 키인 경우 다음을 수행하십시오. dict (zip (df.index, df.value))
aLbAc

47

중복을 보존하는 간단한 방법을 원한다면 다음을 사용할 수 있습니다 groupby.

>>> ptest = pd.DataFrame([['a',1],['a',2],['b',3]], columns=['id', 'value']) 
>>> ptest
  id  value
0  a      1
1  a      2
2  b      3
>>> {k: g["value"].tolist() for k,g in ptest.groupby("id")}
{'a': [1, 2], 'b': [3]}

1
멋지고 우아한 솔루션이지만 50k 행 테이블에서는 아래의 추악한 솔루션보다 약 6 배 느립니다.
dalloliogm 2014-06-24

@dalloliogm : 발생하는 예제 테이블을 제공 할 수 있습니까? Python 루프보다 6 배 느리면 pandas에 성능 버그가있을 수 있습니다.
DSM

23

이 스레드의 joris와 복제 된 스레드의 punchagan의 답변 은 매우 우아하지만 키에 사용 된 열에 중복 된 값이 포함되어 있으면 올바른 결과를 제공하지 않습니다.

예를 들면 :

>>> ptest = p.DataFrame([['a',1],['a',2],['b',3]], columns=['id', 'value']) 
>>> ptest
  id  value
0  a      1
1  a      2
2  b      3

# note that in both cases the association a->1 is lost:
>>> ptest.set_index('id')['value'].to_dict()
{'a': 2, 'b': 3}
>>> dict(zip(ptest.id, ptest.value))
{'a': 2, 'b': 3}

중복 된 항목이 있고이를 잃어 버리고 싶지 않다면 다음과 같은 추악하지만 작동하는 코드를 사용할 수 있습니다.

>>> mydict = {}
>>> for x in range(len(ptest)):
...     currentid = ptest.iloc[x,0]
...     currentvalue = ptest.iloc[x,1]
...     mydict.setdefault(currentid, [])
...     mydict[currentid].append(currentvalue)
>>> mydict
{'a': [1, 2], 'b': [3]}

2
댓글에 블록이 없기 때문에 형식화를 용서하십시오 :mydict = defaultdict(list)\n for (key, val) in ptest[["id", "value"]].itertuples(index=False):\n mydict[key].append(val)
Midnighter

1
원 라이너만큼 우아하지는 않지만 솔루션이 훨씬 더 마음에 들었습니다.
Peter Maguire

9

가장 간단한 솔루션 :

df.set_index('id').T.to_dict('records')

예:

df= pd.DataFrame([['a',1],['a',2],['b',3]], columns=['id','value'])
df.set_index('id').T.to_dict('records')

val1, val2, val3 등과 같은 여러 값이 있고 목록으로 원하는 경우 아래 코드를 사용하십시오.

df.set_index('id').T.to_dict('list')

1
records여기서 무슨 뜻이야?
mingchau

1
@mingchau recordshere 의미 pandas.pydata.org/pandas-docs/stable/reference/api/…‘records’ : list like [{column -> value}, … , {column -> value}] 참조
AmuletxHeart

8

일부 버전에서는 아래 코드가 작동하지 않을 수 있습니다.

mydict = dict(zip(df.id, df.value))

그러니 명시 적으로

id_=df.id.values
value=df.value.values
mydict=dict(zip(id_,value))

참고 단어 ID가 예약어이기 때문에 내가 ID_ 사용


7

'dict comprehension'을 사용할 수 있습니다.

my_dict = {row[0]: row[1] for row in df.values}

pandas를 사용한 루핑은 메모리 사용 측면에서 가장 효율적이지 않습니다. 참조 : engineering.upside.com/…
tda

OP는 가장 효율적인 답변을 요구하지 않았기 때문에 @Dongwan Kim이 좋은 대안 솔루션을 제공했다고 생각합니다.
경제학자

3

중복 항목을 잃지 않는 또 다른 (약간 더 짧은) 솔루션 :

>>> ptest = pd.DataFrame([['a',1],['a',2],['b',3]], columns=['id','value'])
>>> ptest
  id  value
0  a      1
1  a      2
2  b      3

>>> pdict = dict()
>>> for i in ptest['id'].unique().tolist():
...     ptest_slice = ptest[ptest['id'] == i]
...     pdict[i] = ptest_slice['value'].tolist()
...

>>> pdict
{'b': [3], 'a': [1, 2]}

1

사전 값으로 목록이 필요합니다. 이 코드는 트릭을 수행합니다.

from collections import defaultdict
mydict = defaultdict(list)
for k, v in zip(df.id.values,df.value.values):
    mydict[k].append(v)

1

팬더 데이터 프레임 의 열로 사전을 만들려고 시도하는 동안이 질문을 발견했습니다 . 제 경우에는 데이터 프레임에 A, B 및 C 열이 있습니다 (A와 B는 경도와 위도의 지리적 좌표이고 C는 국가 지역 / 주 / 등의 경우입니다).

해당 행의 C (사전 값) 값과 일치하는 A, B 값 (사전 키)의 각 쌍이있는 사전을 원했습니다 (A, B 값의 각 은 이전 필터링으로 인해 고유함이 보장됨). 이 컨텍스트에서 서로 다른 A, B 값 쌍에 대해 동일한 C 값을 가질 수 있으므로 다음과 같이했습니다.

mydict = dict(zip(zip(df['A'],df['B']), df['C']))

pandas to_dict () 사용 도 작동합니다.

mydict = df.set_index(['A','B']).to_dict(orient='dict')['C']

(사전을 만드는 줄을 실행하기 전에 A 또는 B 열이 인덱스로 사용되지 않았습니다)

두 가지 접근 방식 모두 빠릅니다 (85k 행의 데이터 프레임, 5 년 된 고속 듀얼 코어 노트북에서 1 초 미만).

내가 이것을 게시하는 이유 :

  1. 이런 종류의 솔루션이 필요한 사람들을 위해
  2. 누군가가 더 빠른 실행 솔루션 (예 : 수백만 행)을 알고 있다면 답장을 주시면 감사하겠습니다.

0
def get_dict_from_pd(df, key_col, row_col):
    result = dict()
    for i in set(df[key_col].values):
        is_i = df[key_col] == i
        result[i] = list(df[is_i][row_col].values)
    return result

이것은 나의 sloution, 기본 루프


0

이것이 내 해결책입니다.

import pandas as pd
df = pd.read_excel('dic.xlsx')
df_T = df.set_index('id').T
dic = df_T.to_dict('records')
print(dic)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.