أحاول إنشاء كل ثلاثة توائم من البيانات من Patas dataframe استنادًا إلى فئة أو تسمية. لنفترض أن لدي إطار بيانات بمعرف فريد لكل صف وفئة / تصنيف لكل صف. أريد ثلاثة توائم حيث يكون العنصران الأولان من نفس الفئة / التسمية ، والعنصر الأخير من فئة / تسمية مختلفة. أحاول أن أحصل على كل ثلاثة توائم.
يمكنني إنشاء مجموعات من العناصر بنفس التسمية على ما يرام ، ولكن عندما أحاول توسيعها مع العناصر التي لها تصنيفات مختلفة ، أحصل على مصفوفة مليئة None
.
مثال dataframe:
import pandas as pd
import numpy as np
df = pd.DataFrame({'uuid': np.arange(5),
'label': [0, 1, 1, 0, 0]})
print(df)
label uuid
0 0 0
1 1 1
2 1 2
3 0 3
4 0 4
لاحظ ال uuid
العمود مجرد عنصر نائب هنا. النقطة هي أنها فريدة لكل صف. ما يلي يولد جميع تركيبات نفس العناصر ويضعها في قائمة:
import itertools as it
labels = df.label.unique()
all_combos = []
for l in labels:
combos = list(it.combinations(df.loc[df.label == l].as_matrix(), 2))
all_combos.extend([list(c) for c in combos]) # convert to list because I anticipate needing to add to each combo later
all_combos
[[array([0, 0]), array([0, 3])],
[array([0, 0]), array([0, 4])],
[array([0, 3]), array([0, 4])],
[array([1, 1]), array([1, 2])]]
أريد الآن أن يتم إلحاق كل هذه التركيبات مع كل عنصر مختلف .
أنا أحاول:
for l in labels:
combos = list(it.combinations(df.loc[df.label == l].as_matrix(), 2))
combo_list = [list(c) for c in combos]
for c in combo_list:
new_combos = [list(c).extend(s) for s in df.loc[df.label != l].as_matrix()]
all_combos.append(new_combos)
أتوقع:
all_combos
[[array([0, 0]), array([0, 3]), array([1, 1])],
[array([0, 0]), array([0, 3]), array([1, 2])],
[array([0, 0]), array([0, 4]), array([1, 1])],
[array([0, 0]), array([0, 4]), array([1, 2])],
[array([0, 3]), array([0, 4]), array([1, 1])],
[array([0, 3]), array([0, 4]), array([1, 2])],
[array([1, 1]), array([1, 2]), array([0, 0])],
[array([1, 1]), array([1, 2]), array([0, 3])],
[array([1, 1]), array([1, 2]), array([0, 4])]]
انا حصلت:
all_combos
[[None, None], [None, None], [None, None], [None, None, None]]
وهو أمر غريب حقًا: فهما ليسا بنفس الطول! ولكن لدي نفس العدد من None
في نتيجتي كعدد متوقع من ثلاثة توائم صالحة.
حاولت أيضا all_combos.extend(new_combos)
وحصلت على قائمة ثنائية الأبعاد مكونة من 9 عناصر ، لذلك فقط نسخة مسطحة من النتيجة أعلاه. في الواقع أي مزيج من list.extend
و list.append
في السطرين الأخيرين من الحلقة الداخلية ، أعطني إما النتيجة الموضحة أعلاه ، أو نسخة مسطحة من هذه النتيجة ، لا معنى لأي منهما.
تحرير: كما هو مذكور في التعليقات ، list.extend
و list.append
هي عمليات في مكانها ، لذلك لن يعيدوا أي شيء. كيف يمكنني إذن فهم قائمتي لإعطائي هذه القيم؟ أو إعادة بناء شيء آخر يعمل؟