2016-12-10 5 views
3

Я пытаюсь освободить себя от JMP для анализа данных, но не могу определить эквивалент панды функции JMP Split Columns. Я начинаю со следующей DataFrame:pandas DataFrame изменить на несколько значений столбца

In [1]: df = pd.DataFrame({'Level0': [0,0,0,0,0,0,1,1,1,1,1,1], 'Level1': [0,1,0,1,0,1,0,1,0,1,0,1], 'Vals': [1,3,2,4,1,6,7,5,3,3,2,8]}) 
In [2]: df 
Out[2]: 
    Level0 Level1 Vals 
0  0  0  1 
1  0  1  3 
2  0  0  2 
3  0  1  4 
4  0  0  1 
5  0  1  6 
6  1  0  7 
7  1  1  5 
8  1  0  3 
9  1  1  3 
10  1  0  2 
11  1  1  8 

Я могу справиться с некоторыми из выходных сценариев функции JMP, используя функцию pivot_table, но я озадачен на случай, когда Vals столбец делится уникальными комбинациями Level0 и Level1 дать следующий вывод:

Level0 0  1 
Level1 0 1 0 1 
0  1 3 7 5 
1  2 4 3 3 
2  1 6 2 8 

Я попытался pd.pivot_table(df, values='Vals', columns=['Level0', 'Level1']), но это дает средние значения для различных комбинаций:

Level0 Level1 
0  0   1.333333 
     1   4.333333 
1  0   4.000000 
     1   5.333333 

Я также попытался pd.pivot_table(df, values='Vals', index=df.index, columns=['Level0', 'Level1'] который получает мне заголовки столбцов, которые я хочу, но не работает, потому что это заставляет выход иметь одинаковое количество строк, как в оригинале, так что выход имеет много значений: NaN

Level0 0  1 
Level1 0 1 0 1 
0  1 NaN NaN NaN 
1  NaN 3 NaN NaN 
2  2 NaN NaN NaN 
3  NaN 4 NaN NaN 
4  1 NaN NaN NaN 
5  NaN 6 NaN NaN 
6  NaN NaN 7 NaN 
7  NaN NaN NaN 5 
8  NaN NaN 3 NaN 
9  NaN NaN NaN 3 
10  NaN NaN 2 NaN 
11  NaN NaN NaN 8 

Любые предложения?

ответ

3

Это немного обходной путь, но вы можете сделать:

df.pivot_table(index=df.groupby(['Level0', 'Level1']).cumcount(), 
       columns=['Level0', 'Level1'], values='Vals', aggfunc='first') 
Out: 
Level0 0  1 
Level1 0 1 0 1 
0  1 3 7 5 
1  2 4 3 3 
2  1 6 2 8 

Идея заключается в том, что индекс выхода не всегда доступны в оригинальном DataFrame. Вы можете получить его следующим образом:

df.groupby(['Level0', 'Level1']).cumcount() 
Out: 
0  0 
1  0 
2  1 
3  1 
4  2 
5  2 
6  0 
7  0 
8  1 
9  1 
10 2 
11 2 
dtype: int64 

Теперь, если вы передадите это как индекс pivot_table, произвольное aggfunc (среднее, минимум, максимум, первым или последним) должен работать для вас, как те, индекс-колонки пары имеют только одну запись.

+0

Спасибо ayhan. Прекрасно работает. Действительно ли нужен 'aggfunc = 'first''? Я получаю тот же ответ без него. – endangeredoxen

+0

@endangeredoxen Значение по умолчанию - «среднее» для aggfunc. Поскольку существует одно значение, это на самом деле не имеет значения. средний, мин, макс, первый или последний, любой из них будет делать. – ayhan

Смежные вопросы