Pandas - вставлять значения столбцов в новые столбцы

У меня большой фрейм данных, и я храню много избыточных значений, которые затрудняют обработку моих данных. У меня есть датафрейм в форме:

import pandas as pd

df = pd.DataFrame([["a","g","n1","y1"], ["a","g","n2","y2"], ["b","h","n1","y3"], ["b","h","n2","y4"]], columns=["meta1", "meta2", "name", "data"])

>>> df

  meta1 meta2 name data
    a     g   n1   y1
    a     g   n2   y2
    b     h   n1   y3
    b     h   n2   y4

где у меня есть имена новых столбцов, которые я хотел бы вname и соответствующие данные вdata.

Я хотел бы создать фрейм данных в форме:

df = pd.DataFrame([["a","g","y1","y2"], ["b","h","y3","y4"]], columns=["meta1", "meta2", "n1", "n2"])

>>> df

meta1 meta2  n1  n2
  a     g  y1  y2
  b     h  y3  y4

Столбцы называютсяmeta около 15+ других столбцов, которые содержат большую часть данных, и я не думаю, что они особенно хорошо подходят для индексации. Идея в том, что у меня много повторных / избыточных данных, хранящихся вmeta на данный момент, и я хотел бы представить более компактный план данных.

Я нашел несколько похожих Q, но не могу точно определить, какие операции мне нужно выполнить: pivot, re-index, stack или unstack и т. Д.?

PS - исходные значения индекса не важны для моих целей.

Любая помощь приветствуется.

Вопрос, я думаю, связан:

Я думаю, что следующий вопрос связан с тем, что я пытаюсь сделать, но я не понимаю, как его применить, так как я не хочу создавать больше индексов.

Python Pandas - как расстегнуть сводную таблицу с двумя значениями, каждое из которых становится новым столбцом?

Ответы на вопрос(2)

Решение Вопроса

metas = ['meta1', 'meta2']

new_df = df.set_index(['name'] + metas).unstack('name')
print new_df

            data    
name          n1  n2
meta1 meta2         
a     g       y1  y2
b     h       y3  y4

Что дает вам большую часть пути туда. Дополнительный крой поможет вам до конца пути.

print new_df.data.rename_axis([None], axis=1).reset_index()

  meta1 meta2  n1  n2
0     a     g  y1  y2
1     b     h  y3  y4

Ты можешь использоватьpivot_table сreset_index а такжеrename_axis (новый вpandas 0.18.0):

print (df.pivot_table(index=['meta1','meta2'], 
                      columns='name', 
                      values='data', 
                      aggfunc='first')
         .reset_index()
         .rename_axis(None, axis=1))

  meta1 meta2  n1  n2
0     a     g  y1  y2
1     b     h  y3  y4

Но лучше использоватьaggfunc join:

print (df.pivot_table(index=['meta1','meta2'], 
                      columns='name', 
                      values='data', 
                      aggfunc=', '.join)
         .reset_index()
         .rename_axis(None, axis=1))

  meta1 meta2  n1  n2
0     a     g  y1  y2
1     b     h  y3  y4

Объяснение, почемуjoin как правило, лучше, чемfirst:

Если использоватьfirstВы можете потерять все данные, которые не являются первыми в каждой группеindex, ноjoin конкенировать их:

import pandas as pd

df = pd.DataFrame([["a","g","n1","y1"], 
                   ["a","g","n2","y2"], 
                   ["a","g","n1","y3"], 
                   ["b","h","n2","y4"]], columns=["meta1", "meta2", "name", "data"])

print (df)
  meta1 meta2 name data
0     a     g   n1   y1
1     a     g   n2   y2
2     a     g   n1   y3
3     b     h   n2   y4

print (df.pivot_table(index=['meta1','meta2'], 
                      columns='name', 
                      values='data', 
                      aggfunc='first')
         .reset_index()
         .rename_axis(None, axis=1))
  meta1 meta2    n1  n2
0     a     g    y1  y2
1     b     h  None  y4

print (df.pivot_table(index=['meta1','meta2'], 
                      columns='name', 
                      values='data', 
                      aggfunc=', '.join)
         .reset_index()
         .rename_axis(None, axis=1))

  meta1 meta2      n1  n2
0     a     g  y1, y3  y2
1     b     h    None  y4 
 oliversm15 июн. 2016 г., 17:47
что я назвалmeta на самом деле несколько других столбцов.
 jezrael15 июн. 2016 г., 18:06
@piRSquared - Спасибо.
 piRSquared15 июн. 2016 г., 18:04
Отличный ответ как всегда @jezrael
 jezrael15 июн. 2016 г., 17:50
Извините, колонкаmeta это не один, но больше столбцов, какmeta1, meta2...?
 oliversm15 июн. 2016 г., 17:58
Вопрос отредактирован: надеюсь, это проясняет ситуацию.
 Jarad17 июл. 2018 г., 19:41
aggfunc='first' великолепен для текстовых данных!
 jezrael15 июн. 2016 г., 18:05
Спасибо, я тоже редактирую ответ.

Ваш ответ на вопрос