데이터 프레임을 사전으로 변환하는 방법
저는 두 개의 열이 있는 데이터 프레임을 가지고 있는데 그것을 사전으로 변환하려고 합니다.첫 번째 열이 키가 되고 두 번째 열이 값이 됩니다.
데이터 프레임:
id value
0 0 10.2
1 1 5.7
2 2 7.4
어떻게 해야 하나요?
한다면lakes
당신의DataFrame
당신은 다음과 같은 것을 할 수 있습니다.
area_dict = dict(zip(lakes.id, lakes.value))
의 문서를 참조하십시오. 다음과 같이 사용할 수 있습니다.
df.set_index('id').to_dict()
그리고 열이 하나만 있는 경우 열 이름을 피하기 위해 딕트의 수준도 사용됩니다(실제로 이 경우에는Series.to_dict()
):
df.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]}
제가 생각하는 가장 간단한 해결책은 다음과 같습니다.
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
위에서: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_dict.html
당신은 '독어 이해'를 사용할 수 있습니다.
my_dict = {row[0]: row[1] for row in df.values}
판다를 사용하면 다음과 같은 작업을 수행할 수 있습니다.
호수가 데이터 프레임인 경우:
area_dict = lakes.to_dict('records')
일부 버전에서는 아래 코드가 작동하지 않을 수 있습니다.
mydict = dict(zip(df.id, df.value))
그러니 명시적으로 하라.
id_=df.id.values
value=df.value.values
mydict=dict(zip(id_,value))
참고 단어 ID가 예약 단어이기 때문에 id_를 사용했습니다.
다음은 3개의 열 A, B 및 C(A와 B가 경도와 위도의 지리적 좌표이고 C는 국가 지역/주/주/등이라고 가정)로 데이터 프레임을 변환하는 예입니다.
해당 행의 C 값(사전 키)과 일치하는 각 A,B 값 쌍(사전 키)이 있는 사전을 원합니다(A,B 값 쌍은 이전 필터링으로 인해 고유한 것으로 보장되지만 이 컨텍스트에서 서로 다른 A,B 값 쌍에 대해 동일한 C 값을 가질 수 있습니다). 따라서 다음 작업을 수행합니다.
mydict = dict(zip(zip(df['A'],df['B']), df['C']))
판다를_dict()에 사용하는 것도 효과가 있습니다.
mydict = df.set_index(['A','B']).to_dict(orient='dict')['C']
(사전을 생성하는 줄을 실행하기 전에 A 또는 B 열을 인덱스로 사용하지 않음)
두 가지 접근 방식 모두 빠릅니다(2015년식 고속 듀얼 코어 노트북에서 85,000개의 행이 있는 데이터 프레임에서는 1초 미만).
중복 항목을 잃지 않는 또 다른(약간 짧은) 솔루션:
>>> 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]}
여러분이 팬더와 놀고 싶다면 이것도 할 수 있습니다.하지만, 저는 펀치건의 방식을 좋아합니다.
# replicating your dataframe
lake = pd.DataFrame({'co tp': ['DE Lake', 'Forest', 'FR Lake', 'Forest'],
'area': [10, 20, 30, 40],
'count': [7, 5, 2, 3]})
lake.set_index('co tp', inplace=True)
# to get key value using pandas
area_dict = lake.set_index('area').T.to_dict('records')[0]
print(area_dict)
output: {10: 7, 20: 5, 30: 2, 40: 3}
데이터 프레임이 '호수'인 경우 다음과 같은 작업도 수행할 수 있습니다.
# Your dataframe
lakes = pd.DataFrame({'co tp': ['DE Lake', 'Forest', 'FR Lake', 'Forest'],
'area': [10, 20, 30, 40],
'count': [7, 5, 2, 3]})
lakes.set_index('co tp', inplace=True)
내 솔루션:
area_dict = lakes.set_index("area")["count"].to_dict()
또는 @punchagan의 해결책(내가 선호하는 것)
area_dict = dict(zip(lakes.area, lakes.count))
둘 다 작동해야 합니다.
당신은 이것이 필요합니다.
area_dict = lakes.to_dict(orient='records')
사전 값으로 목록이 필요합니다.이 코드로 해결할 수 있습니다.
from collections import defaultdict
mydict = defaultdict(list)
for k, v in zip(df.id.values,df.value.values):
mydict[k].append(v)
인덱스를 사전보다 설정하면 고유한 키 값 쌍이 생성됩니다.
encoder=LabelEncoder()
df['airline_enc']=encoder.fit_transform(df['airline'])
dictAirline= df[['airline_enc','airline']].set_index('airline_enc').to_dict()
편집:
다음과 같은 방법으로 동일한 결과를 얻을 수 있습니다.
filter_list = df[df.Col.isin(criteria)][['Col1','Col2']].values.tolist()
원본 게시물:
저도 비슷한 문제가 있었는데, 데이터 프레임을 목록의 결과로 필터링하려고 했습니다.
이것이 제 해결책이었습니다.
filter_df = df[df.Col.isin(criteria)][['Col1','Col2']]
filter_list = filter_df.to_dict(orient='tight')
filter_list = filter_list['data']
결과: 목록
출처: 팬더.DataFrame.to _http://dict
값 열에 일부 중복 값이 있고 중복 값을 사전에 유지하려는 경우
아래 코드가 도움이 될 수 있습니다.
df = pd.DataFrame([['a',1],['a',2],['a',4],['b',3],['b',4],['c',5]], columns=['id', 'value'])
df.groupby('id')['value'].apply(list).to_dict()
output : {'a': [1, 2, 4], 'b': [3, 4], 'c': [5]}
서 많은 은 여서사는많답변은용하기를 합니다.dict(zip(...))
통사론또한 이 기능을 사용하지 않고도 가능합니다.zip
.
mydict = dict(df.values) # {0.0: 10.2, 1.0: 5.7, 2.0: 7.4}
# or for faster code, convert to a list
mydict = dict(df.values.tolist()) # {0.0: 10.2, 1.0: 5.7, 2.0: 7.4}
열이 나하의인 int
는 그고또하는나리입니다.float
OP에서처럼, 그 다음에 캐스팅.object
및 called type 및 calldict()
.
mydict = dict(df.astype('O').values) # {0: 10.2, 1: 5.7, 2: 7.4}
mydict = dict(df.astype('O').values.tolist()) # {0: 10.2, 1: 5.7, 2: 7.4}
인덱스를 키로 사용하는 경우 훨씬 더 간단합니다.
mydict = df['value'].to_dict() # {0: 10.2, 1: 5.7, 2: 7.4}
이것이 제 해결책입니다.
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)
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
이것이 제 해결책입니다. 기본 루프입니다.
언급URL : https://stackoverflow.com/questions/18695605/how-to-convert-a-dataframe-to-a-dictionary
'programing' 카테고리의 다른 글
함수의 소스 코드를 보려면 어떻게 해야 합니까? (0) | 2023.06.15 |
---|---|
Git에서 파일이 삭제된 시간 찾기 (0) | 2023.06.15 |
dplyr::filter에서 문자열을 변수 이름으로 전달 (0) | 2023.06.15 |
포인터(주소)가 음수가 될 수 있습니까? (0) | 2023.06.15 |
Ruby에서 해시의 모든 값 변경 (0) | 2023.06.15 |