融合唯一索引的pandas数据帧,以便与ggplot / rpy2一起使用

时间:2013-02-26 22:01:40

标签: python numpy pandas ggplot2 rpy2

此问题与(splitting and concatenating dataframes in Python pandas for plotting with rpy2)有关。我正在使用pandas数据帧并且正在对它们进行各种熔化/未熔化/连接操作,以便我可以使用rpy2使用ggplot2绘制它们。我对如何在具有唯一索引的数据帧上执行这些操作感到困惑。假设数据框df有一个唯一的列runner_id,该列记录了每个参赛者完成两场比赛{,1}}和A之一的时间和速度。每个跑步者都是唯一的,因此DataFrame可以为两个参赛者Bbob提供此形状:

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 非常方便。它还可以防止意外添加重复条目,因为我们知道每个跑步者的所有信息都应该保存在跑步者的行中,而且每个跑步者不能有多行:

runner_id

问题是ggplot需要使用列名df = df.set_index("runner_id") 中的信息,如果我们想绘制两个种族之间的时间或速度差异。然后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允许唯一索引,但也方便熔化表示ggplot?我发现在这两者之间来回走动非常困难/困惑。由跑步者索引的每个种族具有不同时间/速度列的第一个表示非常直观,而ggplot的融合表示令人困惑并且看起来很浪费。

关于如何保持数据帧的这两个或一般规则之间来回转换的任何想法都会有所帮助。使用ggplot时答案不是索引(不是调用df)吗?是否有这种数据帧的首选格式?

一种可能的解决方案是在熔化/熔化时始终对df进行索引/取消索引,例如:

set_index

但这似乎容易出错。例如,如果我想计算每个跑步者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"])]

2 个答案:

答案 0 :(得分:1)

熔化和投射数据框是R.Hadley的包reshape中的一个常见操作(而reshape2其中找到原始的melt()因为某种原因而受欢迎。)

使用ggplot2,您还可以将数据添加到图层中。举个例子:

import rpy2.robjects.pandas2ri
rpy2.robjects.pandas2ri.activate()

p = ggplot2.ggplot(rpy2.robjects.conversion.py2ri(df)) + \
    ggplot2.geom_point(ggplot2.aes_string(x="time_A",y="speed_A"),colour="#ff0000") + \
    ggplot2.geom_point(ggplot2.aes_string(x="time_B",y="speed_B"),colour="#0000ff") + \
    ggplot2.scale_x_continuous("time") + \
    ggplot2.scale_y_continuous("speed")
p.plot()

答案 1 :(得分:0)

对一个长问题的简短而迟来的回答:似乎你可以使用一些帮助来理解长格式数据框架。每个值都是唯一的,因为每个种族只有一个具有给定名称的“跑步者”。它最初可以融化你的大脑,但是对于利用ggplot2的功能非常强大和必不可少。 Hadley Wickham在一些文章中很好地解释了这一点,例如:http://had.co.nz/reshape/paper-dsc2005.pdf