手頭的項目要求用 Tableau 建立一個 story,數據集是摩拜上海城區用戶使用數據。其中有一個維度的數據處理起來有點棘手。python
注意 track 這個維度的數據,它表示的是在訂單時間內的行車軌跡,裏面包含了大量座標點。git
按照 tidydata 的要求:github
我須要將 track 的座標拆分爲多行。數組
Google 了問題的解決方式,代碼是函數
mobike.drop("track",axis = 1).join(mobike["track"].str.split("#",expand = True).stack().reset_index(level = 1,drop = True).rename("track"))
複製代碼
解決問題不能光知其然,不知其因此然。因此我將這行代碼逐語句進行了拆分,一探代碼內部的工做原理。spa
最外層代碼是:code
mobike.join({dataset})
複製代碼
這裏調用了 dataframe 的 join 方法,很基礎。orm
{dataset}
這部分作的工做比較多,首先是 split 方法。Python 的 split 方法能夠將字符串按照指定的字符進行分割,這個例子中指定的字符是「#」。若是不加參數 expand = True
,split()
會返回拆分後的字符串數組。cdn
mobike["track"].str.split("#")
# ["121.372,31.118","121.372,31.119","121.373,31.117","1...]
# ["121.419,31.200","121.419,31.201","121.420,31.199","1...]
# ...
複製代碼
加了 expand = True
會將數組拆開,數組中的每個元素都會單獨保存。blog
mobike["track"].str.split("#",expand = True)
# "121.372,31.118" "121.372,31.119" "121.373,31.117" "1...
# "121.419,31.200" "121.419,31.201" "121.420,31.199" "1...
# ...
複製代碼
到這裏至關於將列中全部文本拆成了一個巨大的表,表中每一個單元格有一個值。有些行拆分後的元素比較少,沒有值能夠填充的單元格補充 None
stack()
會把整個表逐行堆疊成一列。
這樣就成功的將一列中的全部文本拆分紅了多行,並且它是一個 dataframe 。不過到這裏尚未結束,咱們還須要將拆出來的這個 dataframe 與原數據集合並。
注意到拆分出來的 dataframe 是多重索引的,須要用 reset_index()
將多重索引重置掉。在 split()
的時候,咱們引入了超級多的 None。這時候就能夠經過 reset_index(..., drop =True)
將值爲 None 的行刪除。
與原數據集經過 join()
合併的時候,A.join(B)
,A、B兩個 DataFrame 都須要有名字,所以須要 rename("track")
。
至此,咱們的任務算作完了。
我在列拆分爲多行的基礎上,還將 track 拆分紅了兩個變量——track_x,track_y。這裏用到了 pandas 的函數映射進行數據轉換。
mobike["track" = mobike["track"].split(",")
mobike["track_x"] = mobike["track"].map(lambda x:x[0])
mobike["track_y"] = mobike["track"].map(lambda x:x[1])
複製代碼
經過 map 進行列的擴展速度很是很是快。
本文用到的摩拜數據及演示 notebook 都可在 DataWranglingMethod下載。