У меня есть следующий фрейм данных df:
id stage days
--------------------
a1 A 1
a2 A 3
a3 A 2
a4 A 5
a1 B 1
a2 B 2
a1 C 2
a3 D 3
Я применил лямбда-функцию к объекту Pandas GroupBy. Я создал список, объединив столбец stage для каждого идентификатора. Код работает нормально.
df1 = df.groupby('id').apply(lambda x: list(x['stage'])).reset_index()
df1
Результат выглядит так:
a1 [A, B, C]
a2 [A, B]
a3 [A, D]
a4 [A]
Теперь я хочу создать список кортежей для каждой группы id. Тарелка - (stage, days). Я изменил приведенный выше код, как показано ниже:
df2 = df.groupby('id').apply(lambda x:list((x['stage'],x['days']))).reset_index()
df2
Я хочу, чтобы df2 выглядел так:
a1 [(A, 1), (B, 1), (C, 2)]
a2 [(A, 3), (B, 2)]
a3 [(A, 2), (D, 3)]
a4 [(A, 5)]
Однако этот вывод дает мне только первый (stage, days) каждого идентификатора, и это не похоже на кортеж:
a1 [[A], [1]]
a2 [[A], [3]]
a3 [[A], [2]]
a4 [[A], [5]]
Я что-то здесь пропустил? Спасибо!
вы можете опубликовать исходный DataFrame?






Вот минимальный пример. Думаю, вам нужно что-то вроде этого:
df1 = pd.DataFrame({'A1':['a','b','c','a','b'],'B':[3,5,7,8,9], 'C':[10,20,30,40,50]})
df1.groupby('A1').apply(lambda df: list(zip(df['B'],df['C'])))
A1
a [(3, 10), (8, 40)]
b [(5, 20), (9, 50)]
c [(7, 30)]
Данные от Manish, создание столбца кортежа снаружи применяется, должно быть быстрее
df1['New']=list(zip(df1.B,df1.C))
df1
Out[1132]:
A1 B C New
0 a 3 10 (3, 10)
1 b 5 20 (5, 20)
2 c 7 30 (7, 30)
3 a 8 40 (8, 40)
4 b 9 50 (9, 50)
df1.groupby('A1').New.apply(list)
Out[1133]:
A1
a [(3, 10), (8, 40)]
b [(5, 20), (9, 50)]
c [(7, 30)]
Name: New, dtype: object
list()требует итеративного. Как выглядят ваши данные?