2017-02-20 5 views
0

Возможно, это простой способ сделать это, поэтому я надеюсь, что у кого-то есть хорошее решение (в настоящее время я делаю это с уродливыми для циклов).Объедините несколько столбцов в два столбца: «имя столбца» и «значение»

Мои данные выглядит следующим образом:

In [1]: df = pd.DataFrame({'Ref': [5, 6, 7], 
          'Col1': [10,11,12], 
          'Col2': [20,21,22], 
          'Col3': [30,31,32]}) 

In [2]: df 
Out[2]: 
    Col1 Col2 Col3 Ref 
0 10 20 30 5 
1 11 21 31 6 
2 12 22 32 7 

И я пытаюсь сгладить таблицу (для 2D гистограмм) использовать один столбец для идентификатора столбца и один столбец для фактических значений, сохраняя при этом соответствующий Ref , как это:

Ref Col Value 
0 5 1 10 
1 5 2 20 
2 5 3 30 
3 6 1 11 
4 6 2 21 
5 6 3 31 
6 7 1 12 
7 7 2 22 
8 7 3 32 

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

ответ

1

Возможно, это не самое элегантное решение, но оно работает с вашими данными. Использование комбинации pivot_table и stack.

import pandas as pd 

df = pd.DataFrame({'Ref': [5, 6, 7], 
          'Col1': [10,11,12], 
          'Col2': [20,21,22], 
          'Col3': [30,31,32]}) 
# In [23]: df 
# Out[23]: 
#  Col1 Col2 Col3 Ref 
# 0 10 20 30 5 
# 1 11 21 31 6 
# 2 12 22 32 7 

piv = df.pivot_table(index=['Ref']).stack() 
df2 = pd.DataFrame(piv) 
df2.reset_index(inplace=True) 
df2.columns = ['Ref','Col','Value'] 

# In [19]: df2 
# Out[19]: 
#  Ref Col Value 
# 0 5 Col1  10 
# 1 5 Col2  20 
# 2 5 Col3  30 
# 3 6 Col1  11 
# 4 6 Col2  21 
# 5 6 Col3  31 
# 6 7 Col1  12 
# 7 7 Col2  22 
# 8 7 Col3  32 

Если вы хотите «Col», чтобы быть просто последняя цифра имени столбца, могли бы сделать что-то вроде этого:

df2.Col = df2.Col.apply(lambda x: x[-1:]) 

# In [21]: df2 
# Out[21]: 
#  Ref Col Value 
# 0 5 1  10 
# 1 5 2  20 
# 2 5 3  30 
# 3 6 1  11 
# 4 6 2  21 
# 5 6 3  31 
# 6 7 1  12 
# 7 7 2  22 
# 8 7 3  32 
+0

Спасибо, это, безусловно, гораздо более элегантно, чем мой для решения контура;) – tamasgal

+0

Без проблем @tamasgal! Если это сработает для вас, можете ли вы пометить мой ответ как принятый? Благодаря! – jspring

+0

Несомненно, не беспокойтесь, я обычно немного жду, если появятся другие ответы, но, похоже, это не так;) – tamasgal

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