İki sütunlu bir veri çerçevem var ve bunu python sözlüğüne dönüştürmeyi planlıyorum - ilk sütun anahtar ve ikincisi değer olacak. Şimdiden teşekkür ederim.
Veri çerçevesi:
id value
0 0 10.2
1 1 5.7
2 2 7.4
İki sütunlu bir veri çerçevem var ve bunu python sözlüğüne dönüştürmeyi planlıyorum - ilk sütun anahtar ve ikincisi değer olacak. Şimdiden teşekkür ederim.
Veri çerçevesi:
id value
0 0 10.2
1 1 5.7
2 2 7.4
Yanıtlar:
İçin dokümanlara bakın to_dict
. Bunu şu şekilde kullanabilirsiniz:
df.set_index('id').to_dict()
Ve tek bir sütununuz varsa, sütun adından kaçınmak için diktedeki bir düzey de olur (aslında bu durumda kullanırsınız 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))
Yinelenenleri korumanın basit bir yolunu istiyorsanız, şunları kullanabilirsiniz 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]}
Bu ileti dizisindeki joris ve yinelenen ileti dizisindeki punchagan tarafından verilen yanıtlar çok zariftir, ancak anahtarlar için kullanılan sütun herhangi bir yinelenen değer içeriyorsa doğru sonuçları vermeyecektir.
Örneğin:
>>> 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}
Yinelenen girişleriniz varsa ve bunları kaybetmek istemiyorsanız, bu çirkin ama çalışan kodu kullanabilirsiniz:
>>> 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)
En basit çözüm:
df.set_index('id').T.to_dict('records')
Misal:
df= pd.DataFrame([['a',1],['a',2],['b',3]], columns=['id','value'])
df.set_index('id').T.to_dict('records')
Val1, val2, val3, vb. Gibi birden çok değeriniz varsa ve bunları liste olarak istiyorsanız, aşağıdaki kodu kullanın:
df.set_index('id').T.to_dict('list')
records
burada ne anlama geliyor?
records
burada ortalama ‘records’ : list like [{column -> value}, … , {column -> value}]
bakın pandas.pydata.org/pandas-docs/stable/reference/api/...
bazı sürümlerde aşağıdaki kod çalışmayabilir
mydict = dict(zip(df.id, df.value))
bu yüzden açık yap
id_=df.id.values
value=df.value.values
mydict=dict(zip(id_,value))
Not kelime kimliği ayrılmış kelime olduğu i id_ kullanılan
'Dikte anlama' kullanabilirsiniz
my_dict = {row[0]: row[1] for row in df.values}
Yinelenen girişleri kaybetmemek için başka bir (biraz daha kısa) çözüm:
>>> 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]}
Bu soruyu üç taneden sözlük yapmaya çalışırken buldum pandalar veri sütunundan buldum. Benim durumumda, veri çerçevesinin A, B ve C sütunları vardır (diyelim ki A ve B boylam ve enlemin coğrafi koordinatlarıdır ve C, aşağı yukarı durum olan ülke bölgesi / eyalet / vb.).
Her bir A, B değeri çifti (sözlük anahtarı) karşılık gelen satırdaki C (sözlük değeri) değeriyle eşleşen bir sözlük istedim (her A, B değeri çiftinin önceki filtreleme nedeniyle benzersiz olması garanti edildi, ancak Bu bağlamda farklı A, B değerleri çiftleri için aynı C değerine sahip olmak mümkün), ben de yaptım:
mydict = dict(zip(zip(df['A'],df['B']), df['C']))
Pandaların to_dict () kullanılması da işe yarar :
mydict = df.set_index(['A','B']).to_dict(orient='dict')['C']
(Sözlüğü oluşturan satırı çalıştırmadan önce A veya B sütunlarından hiçbiri dizin olarak kullanılmadı)
Her iki yaklaşım da hızlıdır (85.000 satırlı bir veri çerçevesinde bir saniyeden az, 5 yıllık hızlı çift çekirdekli dizüstü bilgisayar).
Bunu göndermemin nedenleri:
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
bu benim eğimim, temel bir döngü