2016-05-02 4 views
3

Я новичок pandas, и я пытаюсь решить следующую проблему.Pandas: «распределять» значения столбцов в несколько строк

У меня есть большой DataFrame (10000 x 28) следующим образом.

Col1 Col2 Col3 Col4 Col5 
    A B C D E 

Как я могу изменить его, чтобы он выглядел следующим образом?

Col1 Col2 NewColName 
    A B C 
    A B D 
    A B E 

Первые две колонки остаются неизменными, и последние три столбца получают «распределенные» над ними.

Моя цель состоит в том, чтобы взять большой DataFrame и превратить его в «аккуратные данные»

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

ответ

1

Установите ['Col1, 'Col2] как index и используйте .stack().

df.set_index(['Col1', 'Col2']).stack() 

Col1 Col2 
A  B  0 C 
      0 D 
      0 E 

Затем сделайте .reset_index() форматировать, как в вашем примере (вы также можете добавить name='Col' для того же результата, как было предложено @jezrael:

df.reset_index(-1, drop=True).reset_index(name='Col') 

    Col1 Col2 0 
0 A B C 
1 A B D 
2 A B E 
+0

Спасибо ..... Я не был знаком с reset_index (actall, еще не знакомый), но он сработал! –

+0

Возможно, лучше добавить имя параметра: 'print df.set_index (['Col1', 'Col2']). Stack(). Reset_index (-1, drop = True) .reset_index (name = 'Col')' – jezrael

+0

Это весьма полезны, также смотрите ключевые слова 'append',' level', 'drop' etc. – Stefan

1

Вы можете использовать melt и drop:

print pd.melt(df, id_vars=['Col1','Col2'],value_name='Col').drop('variable', axis=1) 
    Col1 Col2 Col 
0 A B C 
1 A B D 
2 A B E 

Временные данные:

df = pd.concat([df]*1000).reset_index(drop=True) 

In [58]: %timeit pd.melt(df, id_vars=['Col1','Col2'],value_name='Col').drop('variable', axis=1) 
100 loops, best of 3: 2.48 ms per loop 

In [59]: %timeit df.set_index(['Col1', 'Col2']).stack().reset_index(-1, drop=True).reset_index(name='Col') 
100 loops, best of 3: 3.83 ms per loop 
+0

Этот метод также работал. Спасибо! –

+0

И немного быстрее :) Спасибо за выживание. Приятный день. – jezrael

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