jav*_*ina 5 python list pandas
我有以下数据帧:
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'])
Run Code Online (Sandbox Code Playgroud)
它看起来像这样:
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
Run Code Online (Sandbox Code Playgroud)
我想确定每辆车连续工作中出现的材料.例如,
VehID Material Jobs
10000 5005 [1,2]
10001 5222 [2,3]
Run Code Online (Sandbox Code Playgroud)
我想避免使用for循环.有没有人对这个解决方案有什么建议?提前致谢..
您可以首先使用构造函数将数据收集到列表中pandas.DataFrame.groupby,然后将其作为函数:pandas.DataFrame.applylist
>>> 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]
Run Code Online (Sandbox Code Playgroud)
现在您可以过滤掉所有非连续列表:
>>> 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]
Run Code Online (Sandbox Code Playgroud)
您可以使用更智能的功能来加速它 - 首先存储已排序的列表res,然后检查具有相同长度范围的 min、max 和 len
| 归档时间: |
|
| 查看次数: |
77 次 |
| 最近记录: |