python - الباندا تحويل السلوك غير متناسقة لقائمة




pandas transform (2)

أعتقد أن هذا خطأ في حيوانات الباندا. يمكنك فتح تذكرة على صفحة جيثب من فضلك؟

في البداية اعتقدت أنه قد يكون لأنه لم يتم التعامل مع القائمة بشكل صحيح كحجة .transform . ولكن إذا قمت بذلك:

def create_list(obj):
    print(type(obj))
    return obj.to_list()

df.groupby(['label'])[['wave']].transform(create_list)

أحصل على نفس النتيجة غير المتوقعة. إذا تم استخدام طريقة agg ، فهي تعمل مباشرة:

df.groupby(['label'])['wave'].agg(list)
Out[179]: 
label
a       [1]
b    [2, 3]
c       [4]
Name: wave, dtype: object

لا أستطيع أن أتخيل أن هذا هو السلوك المقصود.

بالمناسبة. كما أنني أجد سلوكًا مختلفًا مشبوهًا ، يظهر إذا قمت بتطبيق tuple على سلسلة مجمعة و dataframe مجمعة. على سبيل المثال ، إذا تم تطبيق transform على سلسلة بدلاً من DataFrame ، فالنتيجة أيضًا ليست سلسلة تحتوي على قوائم ، بل سلسلة تحتوي على ints (تذكر من أجل [['wave']] والتي تنشئ تحويلة بيانات أحادية المقطع transform(tuple) بالفعل tuples عاد):

df.groupby(['label'])['wave'].transform(tuple)
Out[177]: 
0    1
1    2
2    3
3    4
Name: wave, dtype: int64

إذا قمت بذلك مرة أخرى باستخدام agg بدلاً من transform فإنه يعمل مع كل من ['wave'] و [['wave']]

كنت أستخدم الإصدار 0.25.0 على نظام أوبونتو X86_64 لاختباراتي.

لدي نموذج مقتطف يعمل بالشكل المتوقع:

import pandas as pd

df = pd.DataFrame(data={'label': ['a', 'b', 'b', 'c'], 'wave': [1, 2, 3, 4], 'y': [0,0,0,0]})
df['new'] = df.groupby(['label'])[['wave']].transform(tuple)

النتيجه هي:

  label  wave  y     new
0     a     1  0    (1,)
1     b     2  0  (2, 3)
2     b     3  0  (2, 3)
3     c     4  0    (4,)

إنه يعمل بشكل مثير ، إذا بدلاً من tuple في التحويل ، أعطي set, frozenset, dict ، لكن إذا set, frozenset, dict list ، فقد حصلت على نتيجة غير متوقعة تمامًا:

df['new'] = df.groupby(['label'])[['wave']].transform(list)

  label  wave  y  new
0     a     1  0    1
1     b     2  0    2
2     b     3  0    3
3     c     4  0    4

هناك حل بديل للحصول على النتيجة المتوقعة:

df['new'] = df.groupby(['label'])[['wave']].transform(tuple)['wave'].apply(list)

  label  wave  y     new
0     a     1  0     [1]
1     b     2  0  [2, 3]
2     b     3  0  [2, 3]
3     c     4  0     [4]

فكرت في قابلية التغيير / عدم الثبات (قائمة / tuple) ولكن بالنسبة لمجموعة / frozenset كان ثابتًا.

السؤال هو لماذا يعمل بهذه الطريقة؟


لقد واجهت مشكلة مماثلة من قبل. المشكلة الأساسية التي أعتقد أنها عندما يتطابق عدد العناصر في القائمة مع عدد السجلات في المجموعة ، فإنه يحاول تفريغ القائمة بحيث يقوم كل عنصر من عناصر القائمة بتعيين سجل في المجموعة.

على سبيل المثال ، سوف يتسبب ذلك في تفريغ القائمة ، حيث يتطابق طول القائمة مع طول كل مجموعة:

df.groupby(['label'])[['wave']].transform(lambda x: list(x))
    wave
0   1
1   2
2   3
3   4

ومع ذلك ، إذا كان طول القائمة ليس هو نفسه كل مجموعة ، فسوف تحصل على السلوك المطلوب:

df.groupby(['label'])[['wave']].transform(lambda x: list(x)+[0])

    wave
0   [1, 0]
1   [2, 3, 0]
2   [2, 3, 0]
3   [4, 0]

أعتقد أن هذا تأثير جانبي لوظيفة تفريغ القائمة.





pandas-groupby