প্রদত্ত সমস্ত উত্তর সম্ভাব্য বিপজ্জনক আচরণের ফলস্বরূপ কার্যকর কারণ আপনি সম্ভবত একটি ডামি মান নির্বাচন করেন যা ডেটাসেটের অংশ। আপনি অনেকগুলি অ্যাট্রিবিউট যুক্ত গ্রুপ তৈরি করার সাথে সাথে এটি আরও বাড়ছে। সোজা কথায়, পদ্ধতির সর্বদা ভাল করা হয় না।
একটি কম হ্যাকি সমাধান হ'ল পিডি.ড্রপ_ডুলিকেট () ব্যবহার করে নিজের আইডির সাথে প্রতিটি মান সংমিশ্রণের একটি অনন্য সূচক তৈরি করতে হবে এবং তারপরে সেই আইডিতে গ্রুপ করুন। এটি আরও ভার্জোজ কিন্তু কাজটি সম্পন্ন করে:
def safe_groupby(df, group_cols, agg_dict):
# set name of group col to unique value
group_id = 'group_id'
while group_id in df.columns:
group_id += 'x'
# get final order of columns
agg_col_order = (group_cols + list(agg_dict.keys()))
# create unique index of grouped values
group_idx = df[group_cols].drop_duplicates()
group_idx[group_id] = np.arange(group_idx.shape[0])
# merge unique index on dataframe
df = df.merge(group_idx, on=group_cols)
# group dataframe on group id and aggregate values
df_agg = df.groupby(group_id, as_index=True)\
.agg(agg_dict)
# merge grouped value index to results of aggregation
df_agg = group_idx.set_index(group_id).join(df_agg)
# rename index
df_agg.index.name = None
# return reordered columns
return df_agg[agg_col_order]
নোট করুন যে আপনি এখন কেবল নিম্নলিখিতটি করতে পারেন:
data_block = [np.tile([None, 'A'], 3),
np.repeat(['B', 'C'], 3),
[1] * (2 * 3)]
col_names = ['col_a', 'col_b', 'value']
test_df = pd.DataFrame(data_block, index=col_names).T
grouped_df = safe_groupby(test_df, ['col_a', 'col_b'],
OrderedDict([('value', 'sum')]))
এটি ডামি মান হিসাবে ভুল করে এমন সত্যিকারের ডেটা ওভাররাইটিংয়ের বিষয়ে চিন্তা না করেই সফল ফলাফলটি ফিরিয়ে দেবে।