2015-11-11 7 views
3

Я пытаюсь создать скрипку в seaborn. Вход представляет собой pandas DataFrame, и похоже, что для разделения данных вдоль оси x мне нужно различать один столбец. Я в настоящее время DataFrame что значения с плавающей точкой для нескольких датчиков:Уменьшить количество столбцов в pandas DataFrame

>>>df.columns 
Index('SensorA', 'SensorB', 'SensorC', 'SensorD', 'group_id') 

То есть, каждый столбец Sensor[A-Z] содержит кучу цифр:

>>>df['SensorA'].head() 
0 0.072706 
1 0.072698 
2 0.072701 
3 0.072303 
4 0.071951 
Name: SensorA, dtype: float64 

И для этой проблемы, я заинтересован только в 2-х группах:

>>>df['group_id'].unique() 
'1', '2' 

Я хочу, чтобы каждый Sensor быть отдельной скрипкой вдоль оси х.

Я думаю, что это означает, что мне нужно, чтобы преобразовать это в чем-то вида:

>>>df.columns 
Index('Value', 'Sensor', 'group_id') 

где Sensor столбец в новом DataFrame содержит текст «SensorA», «SensorB» и т.д., Value столбец в новом DataFrame содержит значения, которые были оригинальными в каждом столбце Sensor[A-Z], и информация группы сохраняется.

я мог бы создать violinplot с помощью следующей команды:

ax = sns.violinplot(x="Sensor", y="Value", hue="group_id", data=df) 

Я думаю, что я вроде нужно сделать обратный стержень. Есть ли простой способ сделать это?

+0

не могли бы вы предоставить некоторые данные из вашего фрейма данных? –

+0

Я просто добавил несколько примеров данных – mgig

ответ

3

melt Используйте функцию панды

import pandas as pd 
import numpy as np 
df = pd.DataFrame({'SensorA':[1,3,4,5,6], 'SensorB':[5,2,3,6,7], 'SensorC':[7,4,8,1,10], 'group_id':[1,2,1,1,2]}) 
df = pd.melt(df, id_vars = 'group_id', var_name = 'Sensor') 
print df 

дает

group_id Sensor value 
0   1 SensorA  1 
1   2 SensorA  3 
2   1 SensorA  4 
3   1 SensorA  5 
4   2 SensorA  6 
5   1 SensorB  5 
6   2 SensorB  2 
7   1 SensorB  3 
8   1 SensorB  6 
9   2 SensorB  7 
10   1 SensorC  7 
11   2 SensorC  4 
12   1 SensorC  8 
13   1 SensorC  1 
14   2 SensorC  10 
+0

Похоже, что это создает иерархический индекс. Как преобразовать его в столбец «Датчик» и сохранить файл user_id? – mgig

+0

Что такое идентификатор пользователя? Не могли бы вы привести минимальный рабочий пример в вашем вопросе, указав df и желаемый результат? –

+1

'reset_index()' – mwaskom

1

Может это не самый лучший способ, но он работает (AFAIU):

import pandas as pd 
import numpy as np 
df = pd.DataFrame({'SensorA':[1,3,4,5,6], 'SensorB':[5,2,3,6,7], 'SensorC':[7,4,8,1,10], 'group_id':[1,2,1,1,2]}) 
groupedID = df.groupby('group_id') 
df1 = pd.DataFrame() 
for groupNum in groupedID.groups.keys(): 
    dfSensors = groupedID.get_group(groupNum).filter(regex='Sen').stack() 
    _, sensorNames = zip(*dfSensors.index) 
    df2 = pd.DataFrame({'Sensor': sensorNames, 'Value':dfSensors.values, 'group_id':groupNum}) 
    df1 = pd.concat([df1, df2]) 
print(df1) 

Выход:

Sensor Value group_id 
0 SensorA  1   1 
1 SensorB  5   1 
2 SensorC  7   1 
3 SensorA  4   1 
4 SensorB  3   1 
5 SensorC  8   1 
6 SensorA  5   1 
7 SensorB  6   1 
8 SensorC  1   1 
0 SensorA  3   2 
1 SensorB  2   2 
2 SensorC  4   2 
3 SensorA  6   2 
4 SensorB  7   2 
5 SensorC  10   2 
Смежные вопросы