2016-06-15 2 views
2

У меня большой размер данных, и я храню много избыточных значений, которые затрудняют обработку моих данных. У меня есть dataframe формы: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.

Я хотел бы, чтобы произвести dataframe формы:

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, и я хотел бы представить более компактную информационную рамку.

Я нашел некоторые аналогичные Qs, но не могу определить, какие операции мне нужно делать: поворот, переиндексация, стекирование или отрыв и т. Д.?

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

Любая помощь будет высоко оценена.

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

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

ответ

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 
3

Вы можете использовать pivot_table с reset_index и rename_axis (новый в pandas0.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 

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

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 concanecate их:

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 
+0

То, что я назвал 'meta', на самом деле представляет собой несколько других столбцов. – oliversm

+0

Извините, столбец 'meta' не один, но больше столбцов, например' meta1', 'meta2' ...? – jezrael

+0

Вопрос отредактирован: надеюсь, это делает его более ясным. – oliversm

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