คำตอบทั้งหมดที่ให้มาส่งผลให้เกิดพฤติกรรมที่อาจเป็นอันตรายเนื่องจากเป็นไปได้ค่อนข้างที่คุณจะเลือกค่าจำลองที่เป็นส่วนหนึ่งของชุดข้อมูล สิ่งนี้มีแนวโน้มมากขึ้นเมื่อคุณสร้างกลุ่มที่มีคุณสมบัติมากมาย พูดง่ายๆก็คือวิธีการที่ไม่ได้พูดคุยกันได้ดีเสมอไป
วิธีแก้ปัญหาแฮ็คที่น้อยกว่าคือการใช้ pd.drop_duplicates () เพื่อสร้างดัชนีที่ไม่ซ้ำกันของการรวมค่าแต่ละค่าด้วย ID ของตัวเองแล้วจัดกลุ่มในรหัสนั้น มันละเอียดมากขึ้น แต่ทำงานให้เสร็จ:
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')]))
สิ่งนี้จะส่งคืนผลลัพธ์ที่สำเร็จโดยไม่ต้องกังวลเกี่ยวกับการเขียนทับข้อมูลจริงที่เข้าใจผิดว่าเป็นค่าตัวอย่าง