2013-02-26 99 views
3

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

回答

1

熔鍊和鑄造數據幀是R.哈德利的包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() 
0

短而遲來的答案很長的問題:它似乎是你可以使用一些幫助理解長格式的數據幀。每個值都是獨一無二的,因爲每個種族只有一個具有給定名字的'跑步者'。它可以首先融化你的大腦,但是對於利用ggplot2的功能來說,它是非常強大和必不可少的。 Hadley Wickham在一些文章中對此進行了很好的解釋,例如:http://had.co.nz/reshape/paper-dsc2005.pdf