这个问题与(在 Python pandas 中拆分和连接数据帧以使用 rpy2 进行绘图)有关。我正在使用 pandas 数据框,并对它们进行各种熔化/解熔化/连接操作,以便我可以使用 rpy2 用 ggplot2 绘制它们。我对如何对具有唯一索引的数据帧执行这些操作感到有些困惑。假设数据框df
有一个唯一的列, runner_id
该列记录每个跑步者完成两场比赛之一的时间和速度,比赛A
和B
. 每个跑步者都是独一无二的,因此 DataFrame 可以为两个跑步者具有这种形状,bob
并且mary
:
df = pandas.DataFrame([{"runner_id": "bob", "time_A": 30,
"time_B": 25, "speed_A": 5, "speed_B": 10},
{"runner_id": "mary", "time_A": 29,
"time_B": 19, "speed_A": 8, "speed_B": 12}])
df
看起来像这样:
runner_id speed_A speed_B time_A time_B
0 bob 5 10 30 25
1 mary 8 12 29 19
由于跑步者是独一无二的,因此索引 dataframe 非常方便runner_id
。它还可以防止意外添加重复条目,因为我们知道每个跑步者的所有信息都应该保存在跑步者的行中,并且每个跑步者不能有多个行:
df = df.set_index("runner_id")
问题是 ggplot 需要使用列名中的信息time_A, time_B, speed_A, speed_B
,如果我们想绘制两个种族之间的时间或速度差异。然后df
需要看起来像这样:
runner_id race time speed
bob A ... ...
mary A
bob B
mary B
这样我们就可以做到:
ggplot2.ggplot(df) + \
ggplot2.geom_point(aes_string(x="time", y="speed", colour="race")) ...
虽然这违反了runner_id
条目的唯一性,因为跑步者需要被复制。一般如何处理这个问题?是否有一个很好的形式可以保留df
,允许唯一的索引,但也方便 ggplot 的融化表示?我发现在这两者之间来回切换非常困难/令人困惑。每场比赛有不同的时间/速度列的第一个表示,由跑步者索引,非常直观,而 ggplot 的融化表示令人困惑,似乎很浪费。
任何关于在这两个或关于如何保留数据框的一般规则之间来回转换的想法都会有所帮助。set_index
使用ggplot时的答案不是索引(不是调用)吗?这种数据帧有首选格式吗?
一种可能的解决方案是在解开/熔化时始终索引/取消索引 df,例如:
melted_df = pandas.melt(df.reset_index(), id_vars="runner_id")
但这似乎容易出错。例如,如果我想计算每个跑步者的速度和A
比赛时间的平均值,我可以尝试列出A
条目:
# This is already complicated
a_entries = melted_df[map(lambda x: x.endswith("_A"), melted_df["variable"])]
我知道有冗余/融化的表示,所以很难做不重复计算跑步者的操作,因为每个跑步者现在出现两次:
runner_id variable value
0 bob speed_A 5
1 mary speed_A 8
4 bob time_A 30
5 mary time_A 29