কীভাবে পান্ডাস ডেটাফ্রেমকে শ্রেণিবদ্ধ অভিধানে রূপান্তর করা যায় to


16

আমার কাছে নীচের পান্ডাস ডেটাফ্রেম রয়েছে:

df1 = pd.DataFrame({'date': [200101,200101,200101,200101,200102,200102,200102,200102],'blockcount': [1,1,2,2,1,1,2,2],'reactiontime': [350,400,200,250,100,300,450,400]})

আমি এম্বেডড ডিকশনারিটির মানগুলি তালিকা হিসাবে দেখায় এমন একটি শ্রেণিবদ্ধ অভিধান তৈরি করার চেষ্টা করছি: এটি দেখতে এইরকম দেখাচ্ছে:

{200101: {1:[350, 400], 2:[200, 250]}, 200102: {1:[100, 300], 2:[450, 400]}}

আমি এই কিভাবে করব? আমার কাছে সবচেয়ে কাছেরটি এই কোডটি ব্যবহার করছে:

df1.set_index('date').groupby(level='date').apply(lambda x: x.set_index('blockcount').squeeze().to_dict()).to_dict()

যা ফেরত:

{200101: {1: 400, 2: 250}, 200102: {1: 300, 2: 400}}

উত্তর:


20

এখানে ব্যবহারের অন্য উপায় pivot_table:

d = df1.pivot_table(index='blockcount',columns='date',
     values='reactiontime',aggfunc=list).to_dict()

print(d)

{200101: {1: [350, 400], 2: [200, 250]},
 200102: {1: [100, 300], 2: [450, 400]}}

7

IIUC

    df1.groupby(['date','blockcount']).reactiontime.agg(list).unstack(0).to_dict()
{200101: {1: [350, 400], 2: [200, 250]}, 200102: {1: [100, 300], 2: [450, 400]}}

5

আপনি নিম্নলিখিতটি করতে পারেন,

df2 = df1.groupby(['date', 'blockcount']).agg(lambda x: pd.Series(x).tolist())

# Formatting the result to the correct format
dct = {}
for k, v in df2["reactiontime"].items():
  if k[0] not in dct: 
    dct[k[0]] = {}
  dct[k[0]].update({k[1]: v})

যা উত্পাদন করে,

>>> {200101: {1: [350, 400], 2: [200, 250]}, 200102: {1: [100, 300], 2: [450, 400]}}

dct আপনার প্রয়োজনীয় ফলাফলটি ধরে রাখে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.