[英]Pandas: Aggregating List Values in Columns
我有以下數據幀:
data = {'VehID' : pd.Series([10000,10000,10000,10001,10001,10001,10001]),
'JobNo' : pd.Series([1,2,2,1,2,3,3]),
'Material' : pd.Series([5005,5100,5005,5888,5222,5888,5222])}
df = pd.DataFrame(data, columns=['VehID','JobNo','Material'])
它看起來像這樣:
VehID JobNo Material
0 10000 1 5005
1 10000 2 5100
2 10000 2 5005
3 10001 1 5888
4 10001 2 5222
5 10001 3 5888
6 10001 3 5222
我想確定每輛車連續工作中出現的材料。 例如,
VehID Material Jobs
10000 5005 [1,2]
10001 5222 [2,3]
我想避免使用for循環。 有沒有人對這個解決方案有什么建議? 提前致謝..
您可以先使用pandas.DataFrame.groupby
數據收集到列表中,然后使用list
構造函數將pandas.DataFrame.apply
作為函數收集:
>>> res = df.groupby(['VehID', 'Material'])['JobNo'].apply(list).reset_index()
>>> res
VehID Material JobNo
0 10000 5005 [1, 2]
1 10000 5100 [2]
2 10001 5222 [2, 3]
3 10001 5888 [1, 3]
現在您可以過濾掉所有非連續列表:
>>> f = res.JobNo.apply(lambda x: len(x) > 1 and sorted(x) == range(min(x), max(x)+1))
>>> res[f]
VehID Material JobNo
0 10000 5005 [1, 2]
2 10001 5222 [2, 3]
您可以通過更智能的功能加速它 - 首先在res
存儲alreadt排序列表,然后檢查min,max和len與相同長度的范圍
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.