【问题标题】:Reduce number of columns in a pandas DataFrame减少 pandas DataFrame 中的列数
【发布时间】:2015-11-11 19:06:17
【问题描述】:

我正在尝试在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)

我想我有点需要做一个反向枢轴。有没有简单的方法可以做到这一点?

【问题讨论】:

  • 您能提供一些数据框中的数据吗?
  • 我刚刚添加了一些示例数据

标签: python pandas seaborn


【解决方案1】:

使用panda的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

【讨论】:

  • 它看起来像创建了一个分层索引。然后如何将其转换为“传感器”列,并且仍然保留“user_id”?
  • 用户 ID 是什么?您能否在问题中给出一个最小的工作示例,显示 df 和所需的输出?
  • 顺便说一句,我也会调查panda.melt。这对我来说似乎有点好,因为您可以在重塑操作本身中对列进行命名,这似乎不太可能成为微妙错误的牺牲品。
  • 感谢@mwaskom,我不知道melt,但这似乎正是要走的路。我相应地更新了答案。
【解决方案2】:

可能这不是最好的方法,但它有效(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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多