programing

데이터 프레임을 사전으로 변환하는 방법

i4 2023. 6. 15. 21:34
반응형

데이터 프레임을 사전으로 변환하는 방법

저는 두 개의 열이 있는 데이터 프레임을 가지고 있는데 그것을 사전으로 변환하려고 합니다.첫 번째 열이 키가 되고 두 번째 열이 값이 됩니다.

데이터 프레임:

    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는 그고또하는나리입니다.floatOP에서처럼, 그 다음에 캐스팅.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

반응형