python - 融化唯一索引的 pandas 数据帧以与 ggplot/rpy2 一起使用

标签 python numpy pandas ggplot2 rpy2

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

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

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 的融化表示令人困惑并且看起来很浪费。

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

一个潜在的解决方案是在解熔/熔化时始终对 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

最佳答案

熔化和转换数据帧是 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()

关于python - 融化唯一索引的 pandas 数据帧以与 ggplot/rpy2 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15100197/

相关文章:

python - 比较两个不同大小的数组(A的分量在B中)

file - 如何将 .npy 文件作为 numpy 数组加载到 Google Colab 上的虚拟机中

python - 当 numpy int32 数组转换为 float32 时,值会发生变化

python - 将 Pandas DataFrame 分成满足条件的行之间的部分

python - 如何根据 IntervalIndex 对跳过的日期时间的值求和?

python - 在pygame python3中创建登录系统

python - 如何将字典转换为列表?

python - 如何将频谱图数据转换为张量(或多维 numpy 数组)?

python - python中的Np随机采样

python - 如何自定义奥斯卡地址表单字段?