有乙份下面格式使用者遊覽日誌的資料(複製下面顯示的**後,執行下面的**才會出現相同的結果):
import pandas as pd
df = pd.read_clipboard(
)df
結果:
uidstart
end0a1
21a4
72a3
63a8
94b2
35b4
76b10
117b6
88b12
159c14
15其中uid表示每個使用者,start表示起始遊覽時間,end表示結束遊覽的時間,從上表可以看到,存在遊覽時間重疊的情況,例如使用者a的遊覽時間3-6和4-7重疊,可以認為遊覽時間是3-7。
我們現在要做的事就是把每個使用者的存在重疊的遊覽時間合併到一起,最終並按照時間順序排序顯示。
注意:3-4和4-6也屬於重疊的時間,可以合併為3-6。
取出乙個使用者的資料,用於測試操作:
tmp = df.groupby(
"uid"
).get_group(
'b')
tmp
結果:
uidstart
end4b2
35b4
76b10
117b6
88b12
15觀察發現,要解決這個問題,我們首先需要對資料按照開始時間排序。
排序後:
tmp = tmp.sort_values(
'start'
)tmp
結果:
uidstart
end4b2
35b4
77b6
86b10
118b12
15觀察排序後的資料,我們就能很快的觀察出合併的規則:
result =
for uid, start, end in tmp.values:
# 如果結果集中還沒有資料或者當前記錄的起始時間大於上一條記錄的結束時間
# 就可以直接將當前記錄加入到結果集
ifnot result or start > result[-1
][2]
:[uid, start, end]
)else
:# 否則,說明可以將當前記錄與上一條記錄合併
# 合併方法是如果當前記錄的結束時間大於上一條記錄的結束時間,
# 則上一條記錄的結束時間修改為當前記錄的結束時間
result[-1
][2]
=max
(result[-1
][2]
, end)
tmp = pd.dataframe(result, columns=
["uid"
,"start"
,"end"])
tmp
結果:
uidstart
end0b2
31b4
82b10
113b12
15
result =
for uid, tmp in df.groupby(
"uid"):
tmp = tmp[
["start"
,"end"]]
.sort_values(
'start'
) rows =
for start, end in tmp.values:
ifnot rows or start > rows[-1
][2]
:[uid, start, end]
)else
: rows[-1
][2]
=max
(rows[-1
][2]
, end)
tmp = pd.dataframe(rows, columns=
["uid"
,"start"
,"end"])
result = pd.concat(result)
result
結果:
uidstart
end0a1
21a3
72a8
90b2
31b4
82b10
113b12
150c14
15好了,完結,撒花!
pandas列相加 Pandas 基礎
git 上pandas學習教程,共有十章 4個板塊 pandas基礎 四類操作 四類資料 例子。原文內容系統的講解了pandas庫的使用方法,編排邏輯易懂,覆蓋面廣且含有相應練習,之前已經學習過pandas,但是感覺應用時有些費力,計畫重新按照學習教程再梳理一遍,爭取10天完成學習,enjoy ti...
pandas基礎運算
python for data analysis pandas可以對不同索引的物件進行算術運算。例如 當物件相加時,如果存在不同的索引對,其結果的索引就是該索引對的並集。自動的資料對齊操作在不重疊的索引處引入了na值。並且會在算術運算中傳播。in 1 import numpy as np in 2 ...
Pandas基礎學習
encoding utf 8 import pandas as pd import numpy as np s pd.series 1,3,5,np.nan,6,8 print s dates pd.date range 20130101 periods 6 print dates 生成隨機數,ra...