Pandas: apply: использование лямбды для создания списка кортежей

У меня есть следующий фрейм данных 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]]

Я что-то здесь пропустил? Спасибо!

list() требует итеративного. Как выглядят ваши данные?
Stephen Rauch 27.03.2018 02:52

вы можете опубликовать исходный DataFrame?

kip 27.03.2018 02:58
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
1 497
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вот минимальный пример. Думаю, вам нужно что-то вроде этого:

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

Другие вопросы по теме