基于列值的重复单元格值的数据帧转换

Dataframe transformation based on repeating cell values based on column values

有这样的数据框:

我想知道将其转换为另一个最有效的方法是什么:

我尝试生成 Time 列和 days 之间的所有组合,然后手动创建 Value 列通过检查给定的 Day-Time 单元格,但我确信它一定是一种更有效的方式

使用set_indexstack:

out = (df.set_index('Time').stack().rename_axis(index=['Time', 'Day'])
         .rename('Value').reset_index())
print(out)

# Output
         Time   Day  Value
0   6am – 2pm  Day1   15.4
1   6am – 2pm  Day2   13.4
2   6am – 2pm  Day3   45.0
3  2pm – 10pm  Day1   15.0
4  2pm – 10pm  Day2    2.1
5  2pm – 10pm  Day3    3.4
6  10pm – 6am  Day1   14.0
7  10pm – 6am  Day2   22.0
8  10pm – 6am  Day3   35.0

如果原始索引对您不重要, 您还可以使用 .melt() 方法,该方法的优点是可以对日期进行分组,因此您可以连续获得 1 天的值:

df1 = df.melt(id_vars='Time', var_name='Day', value_name='Value')

结果:

index Time Day Value
0 6am-2pm Day1 15.4
1 2pm-10pm Day1 15.0
2 10pm-6am Day1 14.0
3 6am-2pm Day2 13.4
4 2pm-10pm Day2 2.1
5 10pm-6am Day2 22.0
6 6am-2pm Day3 45.0
7 2pm-10pm Day3 3.4
8 10pm-6am Day3 35.0

在我看来,您甚至可以像这样重新排列列索引以使其更具可读性:

df1 = df1.reindex(columns=['Day','Time','Value'])

结果:

index Day Time Value
0 Day1 6am-2pm 15.4
1 Day1 2pm-10pm 15.0
2 Day1 10pm-6am 14.0
3 Day2 6am-2pm 13.4
4 Day2 2pm-10pm 2.1
5 Day2 10pm-6am 22.0
6 Day3 6am-2pm 45.0
7 Day3 2pm-10pm 3.4
8 Day3 10pm-6am 35.0