इस प्रकार प्रदान किए गए सभी उत्तर संभावित खतरनाक व्यवहार का परिणाम देते हैं क्योंकि यह संभव है कि आप एक डमी मूल्य का चयन करें जो वास्तव में डेटासेट का हिस्सा है। जब आप कई विशेषताओं के साथ समूह बनाते हैं तो इसकी संभावना बढ़ जाती है। सीधे शब्दों में कहें, दृष्टिकोण हमेशा अच्छी तरह से सामान्य नहीं होता है।
एक कम हैकी हल है pd.drop_duplicates () का उपयोग करके प्रत्येक व्यक्ति की अपनी आईडी के साथ मूल्य संयोजन का एक अनूठा सूचकांक बनाने के लिए, और फिर उस आईडी पर समूह बनाएं। यह अधिक क्रिया है लेकिन काम पूरा कर लेता है:
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')]))
यह डमी मूल्य के रूप में गलत डेटा को अधिलेखित करने वाले वास्तविक डेटा के बारे में चिंता किए बिना सफल परिणाम लौटाएगा।