शब्दकोश में अजगर पैंडस डेटाफ्रेम


111

मेरे पास एक दो कॉलम डेटाफ्रेम है, और इसे अजगर शब्दकोश में बदलने का इरादा है - पहला कॉलम कुंजी होगा और दूसरा मूल्य होगा। पहले ही, आपका बहुत धन्यवाद।

डेटा ढांचा:

    id    value
0    0     10.2
1    1      5.7
2    2      7.4

संभव डुप्लिकेट: stackoverflow.com/questions/18012505/…
dalloliogm

आप इस बाहर ?: चेक किए हैं pandas.pydata.org/pandas-docs/dev/generated/...
user2290820

4
@perigee: क्या आप इस प्रश्न को हल करने के लिए उत्तर (यदि सहायक) में से एक को स्वीकार कर सकते हैं? यह अन्य उपयोगकर्ताओं को भी मदद करेगा।
10

यदि आपके पास एक आईडी है जो इंडेक्स से मेल खा रहा है तो आपको इसे इंडेक्स के रूप में सेट करना चाहिए।
फरिस

जवाबों:


152

के लिए डॉक्स देखें to_dict। आप इसे इस तरह से उपयोग कर सकते हैं:

df.set_index('id').to_dict()

और यदि आपके पास केवल एक कॉलम है, तो कॉलम नाम से बचने के लिए भी एक स्तर है जो तानाशाह में है (वास्तव में, इस मामले में आप उपयोग करते हैं Series.to_dict()):

df.set_index('id')['value'].to_dict()

14
ध्यान दें कि यह कमांड डेटा खो देगा यदि ID कॉलम में अनावश्यक मान हैं: >>> ptest = p.DataFrame([['a',1],['a',2],['b',3]], columns=['id', 'value']) >>> ptest.set_index('id')['value'].to_dict()
dalloliogm

9
मेरा कहना है, डॉक्स लिंक में ऐसा कुछ भी नहीं है, जिसने मुझे इस प्रश्न का उत्तर दिया हो।
बेन फुल्टन

@bombayquant डीएसएम और मेरे जवाब नीचे देखें। ध्यान दें कि यह 4 साल पुरानी चर्चा है।
डैलोलीम


47

यदि आप डुप्लिकेट को संरक्षित करने का एक सरल तरीका चाहते हैं, तो आप उपयोग कर सकते हैं 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]}

1
अच्छा और सुरुचिपूर्ण समाधान, लेकिन एक 50k पंक्तियों की मेज पर, यह मेरे बदसूरत समाधान से लगभग 6 गुना धीमा है।
dalloliogm

@dalloliogm: क्या आप एक उदाहरण तालिका दे सकते हैं? यदि यह पायथन लूप की तुलना में छह गुना धीमा है, तो पंडों में एक प्रदर्शन बग हो सकता है।
DSM

23

इस धागे में जोर्किस द्वारा और डुप्लिकेट किए गए धागे में पंचाग द्वारा बहुत ही सुरुचिपूर्ण हैं, हालांकि वे सही परिणाम नहीं देंगे यदि कुंजी के लिए उपयोग किए गए कॉलम में कोई डुप्लिकेट मान है।

उदाहरण के लिए:

>>> 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]}

2
टिप्पणियों में एक ब्लॉक की कमी के कारण स्वरूपण का बहाना:mydict = defaultdict(list)\n for (key, val) in ptest[["id", "value"]].itertuples(index=False):\n mydict[key].append(val)
मध्याह्न

1
जबकि एक-लाइनर जितना सुरुचिपूर्ण नहीं था, मुझे आपका समाधान बहुत पसंद आया।
पीटर

9

सबसे सरल समाधान:

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')

1
recordsयहाँ क्या मतलब है?
मिंगचू

1
@mingchau recordsका मतलब यहाँ ‘records’ : list like [{column -> value}, … , {column -> value}] देखें pandas.pydata.org/pandas-docs/stable/reference/api/…
AmuletxHeart

8

कुछ संस्करणों में नीचे दिया गया कोड काम नहीं कर सकता है

mydict = dict(zip(df.id, df.value))

इसलिए इसे स्पष्ट करें

id_=df.id.values
value=df.value.values
mydict=dict(zip(id_,value))

नोट I ने id_ का उपयोग किया है क्योंकि आईडी शब्द आरक्षित शब्द है


7

आप 'तानाशाही समझ' का उपयोग कर सकते हैं

my_dict = {row[0]: row[1] for row in df.values}

पंडों के साथ लूपिंग स्मृति उपयोग के मामले में सबसे अधिक कुशल नहीं है। देखें: engineering.upside.com/...
TDA

ओपी ने सबसे कुशल जवाब नहीं मांगा इसलिए मुझे लगता है कि @ डोंगवान किम ने अच्छा वैकल्पिक समाधान प्रदान किया।
एक अर्थशास्त्री

3

डुप्लिकेट प्रविष्टियों को न खोने का एक और (थोड़ा कम) समाधान:

>>> 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]}

1

आपको शब्दकोश मूल्य के रूप में एक सूची चाहिए। यह कोड ट्रिक करेगा।

from collections import defaultdict
mydict = defaultdict(list)
for k, v in zip(df.id.values,df.value.values):
    mydict[k].append(v)

1

मुझे यह प्रश्न तीन में से एक शब्दकोश बनाने की कोशिश करते हुए मिलापंडों के डेटाफ़्रेम स्तंभों में से एक । मेरे मामले में डेटाफ्रेम में कॉलम 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 वर्षीय तेज दोहरे कोर लैपटॉप)।

जिन कारणों से मैं यह पोस्ट कर रहा हूं:

  1. उन लोगों के लिए जिन्हें इस तरह के समाधान की आवश्यकता है
  2. अगर किसी को तेजी से निष्पादित समाधान पता है (उदाहरण के लिए, लाखों पंक्तियों के लिए), तो मैं एक उत्तर की सराहना करता हूं।

0
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

यह मेरा सुस्ती, एक बुनियादी पाश है


0

यह मेरा समाधान है:

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)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.