此問題與(splitting and concatenating dataframes in Python pandas for plotting with rpy2)相關。我正在使用熊貓數據框,並且正在對它們進行各種熔化/解除/連接操作,以便我可以使用rpy2將它們與ggplot2進行繪圖。我對如何在具有唯一索引的數據框上執行這些操作感到困惑。假設數據幀df
具有唯一的列runner_id
,其記錄了每個跑步者完成兩個種族之一的時間和速度,種族爲A
和B
。每個轉輪是唯一的,因此數據幀可以有這樣的形狀兩名選手bob
和mary
:融合用於ggplot/rpy2的唯一索引熊貓數據框
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時,答案是不要索引(不要撥打)?有這種數據框的首選格式嗎?
一個潛在的解決方案是unmelting /融化,想什麼時候總指數/ unindex的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