3
我有一個DataFrame
包含測試運行,日期和結果。它看起來像這樣:根據比日期早的條目的存在(不存在)篩選熊貓數據框的條目
TestName;Date;IsPassed
test1;1/31/2017 9:44:30 PM;0
test1;1/31/2017 9:39:00 PM;0
test1;1/31/2017 9:38:29 PM;1
test1;1/31/2017 9:38:27 PM;1
test2;10/31/2016 5:05:02 AM;0
test3;12/7/2016 8:58:36 PM;0
test3;12/7/2016 8:57:19 PM;0
test3;12/7/2016 8:56:15 PM;0
test4;12/5/2016 6:50:49 PM;0
test4;12/5/2016 6:49:50 PM;0
test4;12/5/2016 3:23:09 AM;1
test4;12/4/2016 11:51:29 PM;1
我希望能夠找出在指定日期之前或之後沒有運行的測試名稱。
我當然可以是這樣的:
- 識別所有獨特的測試名稱
- 對於他們每個人找出它們的最小和最大日期
- 此基礎上對各行添加到一個新的
DataFrame
但是有沒有辦法與熊貓本身做到這一點,沒有明確的循環?
更新
基於由@jezrael比方說,我想只保留只發生在2016年。然後,我必須做這樣的測試運行的解決方案嗎?
idx = test_runs.groupby('TestName').Date.agg(['idxmax']).stack().unique()
selected = test_runs.loc[idx].Date < pd.to_datetime('2017-01-01')
tests = test_runs.loc[idx].loc[selected].TestName
print(test_runs[test_runs.TestName.isin(tests)])
輸出:
TestName Date IsPassed
4 test2 2016-10-31 05:05:02 0
5 test3 2016-12-07 20:58:36 0
6 test3 2016-12-07 20:57:19 0
7 test3 2016-12-07 20:56:15 0
8 test4 2016-12-05 18:50:49 0
9 test4 2016-12-05 18:49:50 0
10 test4 2016-12-05 03:23:09 1
11 test4 2016-12-04 23:51:29 1
謝謝!這與我所需要的非常接近。假設我的任務是隻有發生在2016年11月1日以後的運行(不考慮測試2)。我需要使用像這樣的:'idx = test_runs.groupby('TestName')。Date.agg(['idxmax'])。stack()。unique() selected = test_runs.loc [idx] .Date> pd.to_datetime( '2016年11月1日') 測試= test_runs.loc [IDX]的.loc [所選] .TestName 打印(test_runs [test_runs.TestName.isin(測試)])' –
我不確定是否理解,但您似乎可以在輸出中簡單地使用['boolean indexing'](http://pandas.pydata.org/pandas-docs/stable/indexing.html#boolean-indexing)。請檢查答案的最後編輯。 – jezrael
呃,這有點棘手。在得到'selected'後,我需要返回到_original_數據框,並只保留選定的測試名稱,但保留所有日期。我會在一分鐘內更新問題 –