Фрейм данных Pivot / Groupby с дубликатами в столбце индекса с нечисловыми данными - PullRequest
2 голосов
/ 21 июня 2019

давайте предположим, что у меня есть следующий пример кадра данных:

df1 = pd.DataFrame({'col1': ['A', 'A', 'B', 'A'], 'col2': ['CA', 'DA', 'CA', 'CA'], 'col3': [1, 1, 1, 2]})


Out[25]:

  col1 col2 col3
0  A    CA   1 
1  A    DA   1 
2  B    CA   1 
3  A    CA   2 

И я хочу сгруппировать эту таблицу по 'col3' в качестве индекса, а 'col1' в качестве новых столбцов (в этом случае столбцы - 'A' или 'B'), и значения должны быть 'col2'.

Я пробовал это с pivot_table (также с pivot):

pd.pivot_table(df1,index='col3', columns="col1", values=['col2'])

в этом случае ошибка: No numeric types to aggregate, в случае команды pivot ошибка: multiple indexes. Оба случая кажутся мне разумными. Но есть ли возможность сделать это? Когда у меня есть два значения для одного столбца, я предпочитаю следующий результат:

  A                B
1 ['CA', 'DA']     CA
2  'CA'            NaN

1 Ответ

2 голосов
/ 21 июня 2019

Для всех списков в выходных данных с пропущенными значениями добавьте пользовательскую лямбда-функцию:

df1 = pd.pivot_table(df1,index='col3', columns="col1", values='col2',
                     aggfunc = lambda x: x.tolist())
print (df1)
col1         A     B
col3                
1     [CA, DA]  [CA]
2         [CA]   NaN

Если нужны скаляры вместо одного списка элементов, добавьте if-else выражение:

df1 = pd.pivot_table(df1,index='col3', columns="col1", values='col2', 
                     aggfunc = lambda x: x.tolist() if len(x) > 1 else x.iat[0])
print (df1)
col1         A    B
col3               
1     [CA, DA]   CA
2           CA  NaN
...