두 개의 열 데이터 프레임이 있고이를 파이썬 사전으로 변환하려고합니다. 첫 번째 열은 키가되고 두 번째 열은 값이됩니다. 미리 감사드립니다.
데이터 프레임 :
id value
0 0 10.2
1 1 5.7
2 2 7.4
두 개의 열 데이터 프레임이 있고이를 파이썬 사전으로 변환하려고합니다. 첫 번째 열은 키가되고 두 번째 열은 값이됩니다. 미리 감사드립니다.
데이터 프레임 :
id value
0 0 10.2
1 1 5.7
2 2 7.4
답변:
에 대한 문서를 참조하십시오 to_dict
. 다음과 같이 사용할 수 있습니다.
df.set_index('id').to_dict()
그리고 열이 하나만있는 경우 열 이름이 dict의 수준이되는 것을 방지하기 위해 (실제로이 경우)를 사용합니다 Series.to_dict()
.
df.set_index('id')['value'].to_dict()
>>> ptest = p.DataFrame([['a',1],['a',2],['b',3]], columns=['id', 'value']) >>> ptest.set_index('id')['value'].to_dict()
mydict = dict(zip(df.id, df.value))
중복을 보존하는 간단한 방법을 원한다면 다음을 사용할 수 있습니다 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]}
이 스레드의 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]}
mydict = defaultdict(list)\n for (key, val) in ptest[["id", "value"]].itertuples(index=False):\n mydict[key].append(val)
가장 간단한 솔루션 :
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')
records
여기서 무슨 뜻이야?
records
here 의미 pandas.pydata.org/pandas-docs/stable/reference/api/…‘records’ : list like [{column -> value}, … , {column -> value}]
참조
'dict comprehension'을 사용할 수 있습니다.
my_dict = {row[0]: row[1] for row in df.values}
중복 항목을 잃지 않는 또 다른 (약간 더 짧은) 솔루션 :
>>> 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]}
팬더 데이터 프레임 의 세 열로 사전을 만들려고 시도하는 동안이 질문을 발견했습니다 . 제 경우에는 데이터 프레임에 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 초 미만).
내가 이것을 게시하는 이유 :
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, 기본 루프