减少 pandas DataFrame 中的列数
Reduce number of columns in a pandas DataFrame
我正在尝试在 seaborn 中创建小提琴情节。输入是一个 pandas DataFrame,看起来为了沿 x 轴分隔数据,我需要在单个列上进行区分。我目前有一个 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
都是沿 x 轴的独立小提琴。
我认为这意味着我需要将其转换为以下形式:
>>>df.columns
Index('Value', 'Sensor', 'group_id')
其中新 DataFrame 中的 Sensor
列包含文本 "SensorA"、"SensorB" 等,新 DataFrame 中的 Value
列包含的值每个 Sensor[A-Z]
列都是原始的,并且组信息被保留。
然后我可以使用以下命令创建小提琴图:
ax = sns.violinplot(x="Sensor", y="Value", hue="group_id", data=df)
我想我有点需要做一个反向枢轴。有没有简单的方法可以做到这一点?
使用熊猫的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
这可能不是最好的方法,但它确实有效 (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
我正在尝试在 seaborn 中创建小提琴情节。输入是一个 pandas DataFrame,看起来为了沿 x 轴分隔数据,我需要在单个列上进行区分。我目前有一个 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
都是沿 x 轴的独立小提琴。
我认为这意味着我需要将其转换为以下形式:
>>>df.columns
Index('Value', 'Sensor', 'group_id')
其中新 DataFrame 中的 Sensor
列包含文本 "SensorA"、"SensorB" 等,新 DataFrame 中的 Value
列包含的值每个 Sensor[A-Z]
列都是原始的,并且组信息被保留。
然后我可以使用以下命令创建小提琴图:
ax = sns.violinplot(x="Sensor", y="Value", hue="group_id", data=df)
我想我有点需要做一个反向枢轴。有没有简单的方法可以做到这一点?
使用熊猫的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
这可能不是最好的方法,但它确实有效 (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