3

この質問は ( rpy2 でプロットするために Python pandas でデータフレームを分割および連結する ) に関連しています。私はパンダのデータフレームで作業しており、rpy2を使用してggplot2でプロットできるように、それらに対してさまざまな融解/融解/連結操作を行っています。一意のインデックスを持つデータフレームでこれらの操作を行う方法について少し混乱しています。データフレームdfに一意の列が runner_idあり、各ランナーの時間と速度が 2 つのレース ( racesAB. 各ランナーは一意であるため、DataFrame は 2 つのランナーに対して次の形状を持つことができ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")

time_A, time_B, speed_A, speed_B問題は、2 つのレース間の時間または速度の差をプロットする場合、ggplot が列名の情報を使用する必要があることです。次に、次の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 の便利なメルト表現も可能にする、保持するのに適した形式はありますか? これら 2 つの間を行ったり来たりするのは非常に難しい/混乱を招くと思います。ランナーによってインデックス付けされた、レースごとに異なる時間/速度列を持つ最初の表現は非常に直感的ですが、ggplot の溶けた表現は混乱を招き、無駄に思えます。

データフレームを保持する方法に関するこれら 2 つのルールまたは一般的なルールの間で行ったり来たりすることについての考えは役に立ちます。set_indexggplot を使用する場合、答えはインデックスを作成しない ( call しない) ことですか? この種のデータフレームに適した形式はありますか?

考えられる解決策の 1 つは、次のように、融解/融解時に 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"])]

冗長/溶けた表現があることはわかっているので、各ランナーが 2 回表示されるようになったため、ランナーを 2 回カウントしない操作を行うのは困難です。

  runner_id variable  value
0       bob  speed_A      5
1      mary  speed_A      8
4       bob   time_A     30
5      mary   time_A     29
4

2 に答える 2