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