توليد ثلاثة توائم من Dataframe Pandas

1

أحاول إنشاء كل ثلاثة توائم من البيانات من 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 هي عمليات في مكانها ، لذلك لن يعيدوا أي شيء. كيف يمكنني إذن فهم قائمتي لإعطائي هذه القيم؟ أو إعادة بناء شيء آخر يعمل؟

1 إجابة

0

أنا حصلت على العمل. سأترك الأمر هنا في حال واجه أي شخص آخر مشكلة مماثلة ، ولكن كما هو مذكور في التعليقات ، فإن المشكلة هي ذلك list.append و list.extend هي عمليات في مكانها ، وبالتالي العودة None ، حتى داخل قائمة الفهم.

تمكنت من التغلب على هذه المشكلة باستخدام np.concatenate لهرس صفائف بلدي معا:

for l in labels:
    combos = list(it.combinations(df.loc[df.label == l].as_matrix(), 2))
    for c in combos:
        new_combos = [np.concatenate((c, (s,)), axis=0) for s in df.loc[df.label != l].as_matrix()]
        all_combos.extend(new_combos)

أيضا، np.append(c, (s,), axis=0) داخل الفهم القائمة يعمل أيضا.

:مؤلف

أسئلة ذات صلة

فوق
قائمة طعام