首页 > 解决方案 > 如何使用给定数据正确创建熊猫数据框?

问题描述

我有以下实验数据:

experiment1_device = 'Dev2'
experiment1_values = [1, 2, 3, 4]
experiment1_timestamps = [1, 2, 3, 6]
experiment1_task = 'Oil Level'
experiment1_user = 'Sean'

experiment2_device = 'Dev1'
experiment2_values = [5, 6, 7, 8, 9]
experiment2_timestamps = [1, 2, 3, 4, 6]
experiment2_task = 'Ventilation'
experiment2_user = 'Martin'

experiment3_device = 'Dev1'
experiment3_values = [10, 11, 12, 13, 14]
experiment3_timestamps = [1, 2, 3, 4, 6]
experiment3_task = 'Ventilation'
experiment3_user = 'Sean'

每个实验包括:

  1. 进行实验的用户
  2. 用户必须完成的任务
  3. 用户使用的设备
  4. 一系列时间戳...
  5. 以及在某个时间戳读取的一系列数据值,所以len(experimentx_values ) == len(experimentx_timestamps )

数据目前以上述格式给出,可以说是单个变量,但如果需要,我可以更改此输出格式。例如,如果将所有内容都放在一个字典中会更好。

我想要实现的预期输出格式如下: 在此处输入图像描述

Timestamp,User并且Task应该是MultiIndex, 而设备应该是列名, 空 (灰色) 单元格应该只包含NaN.

我尝试了多种方法,pd.Dataframe.from_records但无法获得所需的输出格式。

非常感谢任何帮助!

标签: python-3.xpandasdataframe

解决方案


由于数据存储在所有这些不同的变量中,因此需要大量写入。但是,您应该尝试将每个实验的结果存储在 DataFrame 中(直接来自任何输出这些值),并将所有这些 DataFrames 保存在一个列表中,这将减少您浮动的变量。

给定变量,按如下方式构造 DataFrame:

df1 = pd.DataFrame({'Timestamp': experiment1_timestamps,
                    'User': experiment1_user,
                    'Task': experiment1_task,
                     experiment1_device: experiment1_values})

df2 = pd.DataFrame({'Timestamp': experiment2_timestamps,
                    'User': experiment2_user,
                    'Task': experiment2_task,
                     experiment2_device: experiment2_values})

df3 = pd.DataFrame({'Timestamp': experiment3_timestamps,
                    'User': experiment3_user,
                    'Task': experiment3_task,
                     experiment3_device: experiment3_values})

现在将它们连接到一个 DataFrame 中,将索引设置为您想要的列。看起来您的输出需要所有可能性的笛卡尔积,因此我们将重新索引以获取完整的NaN行:

df = pd.concat([df1, df2, df3]).set_index(['Timestamp', 'User', 'Task']).sort_index()

idx = pd.MultiIndex.from_product([df.index.get_level_values(i).unique() 
                                  for i in range(df.index.nlevels)])
df = df.reindex(idx)

                              Dev2  Dev1
Timestamp User   Task                   
1         Martin Ventilation   NaN   5.0
                 Oil Level     NaN   NaN
          Sean   Ventilation   NaN  10.0
                 Oil Level     1.0   NaN
2         Martin Ventilation   NaN   6.0
                 Oil Level     NaN   NaN
          Sean   Ventilation   NaN  11.0
                 Oil Level     2.0   NaN
3         Martin Ventilation   NaN   7.0
                 Oil Level     NaN   NaN
          Sean   Ventilation   NaN  12.0
                 Oil Level     3.0   NaN
4         Martin Ventilation   NaN   8.0
                 Oil Level     NaN   NaN
          Sean   Ventilation   NaN  13.0
                 Oil Level     NaN   NaN
6         Martin Ventilation   NaN   9.0
                 Oil Level     NaN   NaN
          Sean   Ventilation   NaN  14.0
                 Oil Level     4.0   NaN

推荐阅读