基于列值的重复单元格值的数据帧转换
Dataframe transformation based on repeating cell values based on column values
有这样的数据框:
我想知道将其转换为另一个最有效的方法是什么:
我尝试生成 Time 列和 days 之间的所有组合,然后手动创建 Value 列通过检查给定的 Day-Time 单元格,但我确信它一定是一种更有效的方式
使用set_index
和stack
:
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
有这样的数据框:
我想知道将其转换为另一个最有效的方法是什么:
我尝试生成 Time 列和 days 之间的所有组合,然后手动创建 Value 列通过检查给定的 Day-Time 单元格,但我确信它一定是一种更有效的方式
使用set_index
和stack
:
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 |