मेरे पास एक दो कॉलम डेटाफ्रेम है, और इसे अजगर शब्दकोश में बदलने का इरादा है - पहला कॉलम कुंजी होगा और दूसरा मूल्य होगा। पहले ही, आपका बहुत धन्यवाद।
डेटा ढांचा:
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()
और यदि आपके पास केवल एक कॉलम है, तो कॉलम नाम से बचने के लिए भी एक स्तर है जो तानाशाह में है (वास्तव में, इस मामले में आप उपयोग करते हैं 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]}
इस धागे में जोर्किस द्वारा और डुप्लिकेट किए गए धागे में पंचाग द्वारा बहुत ही सुरुचिपूर्ण हैं, हालांकि वे सही परिणाम नहीं देंगे यदि कुंजी के लिए उपयोग किए गए कॉलम में कोई डुप्लिकेट मान है।
उदाहरण के लिए:
>>> 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, आदि और u उन्हें सूची के रूप में चाहते हैं, तो नीचे दिए गए कोड का उपयोग करें:
df.set_index('id').T.to_dict('list')
recordsयहाँ क्या मतलब है?
recordsका मतलब यहाँ ‘records’ : list like [{column -> value}, … , {column -> value}] देखें pandas.pydata.org/pandas-docs/stable/reference/api/…
कुछ संस्करणों में नीचे दिया गया कोड काम नहीं कर सकता है
mydict = dict(zip(df.id, df.value))
इसलिए इसे स्पष्ट करें
id_=df.id.values
value=df.value.values
mydict=dict(zip(id_,value))
नोट I ने id_ का उपयोग किया है क्योंकि आईडी शब्द आरक्षित शब्द है
आप 'तानाशाही समझ' का उपयोग कर सकते हैं
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 देश क्षेत्र / राज्य / आदि, जो कमोबेश यही स्थिति है)।
मैं A, B मानों (डिक्शनरी की) की प्रत्येक जोड़ी के साथ एक ऐसी डिक्शनरी चाहता था, जो संबंधित पंक्ति में C (डिक्शनरी वैल्यू) के मूल्य से मेल खाती हो ( A, B मानों की प्रत्येक जोड़ी पिछले फ़िल्टरिंग के कारण विशिष्ट होने की गारंटी है, लेकिन यह है A के विभिन्न युग्मों के लिए C का समान मान संभव है, इस संदर्भ में B मान), इसलिए मैंने किया:
mydict = dict(zip(zip(df['A'],df['B']), df['C']))
पांडा का उपयोग to_dict () भी काम करता है:
mydict = df.set_index(['A','B']).to_dict(orient='dict')['C']
(डिक्शनरी बनाने से पहले ए या बी में से कोई भी कॉलम इंडेक्स के रूप में इस्तेमाल नहीं किया गया)
दोनों दृष्टिकोण तेज हैं (85k पंक्तियों के साथ डेटाफ्रेम पर एक सेकंड से भी कम, 5 वर्षीय तेज दोहरे कोर लैपटॉप)।
जिन कारणों से मैं यह पोस्ट कर रहा हूं:
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
यह मेरा सुस्ती, एक बुनियादी पाश है