Python 如何从csv数据集中查找唯一的跟踪?
我有一个包含日志数据的csv文件。其中只有两列是我感兴趣的Python 如何从csv数据集中查找唯一的跟踪?,python,pandas,sorting,unique,Python,Pandas,Sorting,Unique,我有一个包含日志数据的csv文件。其中只有两列是我感兴趣的“case:concept:name”,“concept:name”。这里我主要想找到唯一的跟踪以及这些唯一跟踪在csv中重复的次数 我能够根据索引对'case:concept:name'进行排序,以便以顺序格式可视化步骤 import pandas as pd data = pd.read_csv("D:\Task\B.csv") df = data[["case:concept:name","concept:name"]] df
“case:concept:name”
,“concept:name”
。这里我主要想找到唯一的跟踪以及这些唯一跟踪在csv中重复的次数
我能够根据索引对'case:concept:name'
进行排序,以便以顺序格式可视化步骤
import pandas as pd
data = pd.read_csv("D:\Task\B.csv")
df = data[["case:concept:name","concept:name"]]
df.head()
sort = df.rename_axis('MyIdx').sort_values(by = ['case:concept:name','MyIdx'], ascending = [True, True])
sort.head(50)
我基本上想要所有唯一步骤的计数。这些唯一步骤在整个数据中重复了多少次。你是这样看的吗
df.groupby(["concept:name"]).count().reset_index()
输出:
concept:name case:concept:name
check ticket 9
decide 9
examine casually 6
examine thoroughly 3
pay compensation 3
register request 6
reinitiate request 3
reject request 3
或输出2:
df.groupby(["case:concept:name"]).count().reset_index()
输出
case:concept:name concept:name
1 5
2 5
3 9
4 5
5 13
6 5
按案例编号分组,将组中的任务名称转换为元组并在字典中计数:
...
df = data[["case:concept:name","concept:name"]]
dfg= df.groupby(["case:concept:name"])
dd={}
for k,v in dfg:
print(f"Key:{k} ---> {v}") # inspection
print(type(v)) # inspection
print(type(v["concept_name"]),"\n") # inspection
t=tuple(v["concept:name"])
dd[t]=dd.get(t,0)+1
for process,count in dd.items():
print(f"{process}: {count}")
Output example:
('register request', 'examine thoroughly', 'check ticket', 'decide', 'reject request'): 2
('register request', 'check ticket', 'examine casually', 'decide', 'pay compensation'): 1
...
To save it, e.g:
with open("helpdesk_out.csv","w") as fout:
# using ';' as delimiter
fout.write("process;count\n")
for process,count in dd.items():
proc=str(process).replace("'","")
fout.write(f"{proc};{count}\n")
编辑1:
我们可以使用之前创建的“dd”来计算对数。(您可以用与前面相同的方式写出结果。)
编辑2:
行按案例编号aka“case:concept:name”分组。
为了清除它,一些打印指令被插入到上面的代码中,标记为“检查”。
“k”是键,“v”是组成数据帧的分组行
Key:1 ---> case:concept:name concept:name
0 1 register request
1 1 examine thoroughly
2 1 check ticket
3 1 decide
4 1 reject request
<class 'pandas.core.frame.DataFrame'>
<class 'pandas.core.series.Series'>
Key:2 ---> case:concept:name concept:name
5 2 register request
6 2 check ticket
7 2 examine casually
8 2 decide
9 2 pay compensation
<class 'pandas.core.frame.DataFrame'>
<class 'pandas.core.series.Series'>
etc.
您能给出一个输出示例吗?@kantal(注册请求、彻底检查、检查票据、决定、拒绝请求)^2(电源2)在这里,这基本上意味着这5件事在整个数据集中重复了两次,以此类推。@kantal您可以将输出保存在新的csv文件中,其中还必须指定单个跟踪在整个数据集中按顺序重复了多少次。@kantal brother任何更新……我想要这样的输出(‘注册请求’、‘彻底检查’、‘检查票’、‘决定’、‘拒绝请求’):2(‘注册请求’、‘检查票’、‘随意检查’、‘决定’、‘支付赔偿’):1这里的第一个记录道由5条记录道组成,在整个数据集中重复2次(以上仅在我从数据中的其他地方获得相同信息时才考虑重复)并在csv文件中写入相同信息…输出文件未正确保存。我想要('注册请求'、'彻底检查'、'检查票证'、'决定'、'拒绝请求')全部在一个单元格中,计数数在另一个单元格中。但是每个单元格都正确地保存在单个单元格中,例如“注册请求”一个单元格、“彻底检查”另一个单元格等等……为什么不根据自己的喜好调整输出格式?假设将输出导入电子表格,可以指定“;”作为分隔符。@kan好的,我这样做了,但是现在我还有一个问题,比如说,(a,c,d,e,f)trace是30倍,(a,b,c,e,f)trace是20倍,(a,b,e,f)trace是5倍,现在我必须为上面的(a,c,d,e,f)as(ac,cd,de,ef)和下一个(ab,bc,ce,ef)做配对在此之后,我必须计算ab在整个数据中出现的次数。对于当前场景ab=25和ef=55等,我希望作为输出。您知道如何做到这一点吗…如果您愿意帮助的话。@kantal我得到的输出是这样的“”(“注册请求”、“彻底检查”、“检查票据”、“决定”、“拒绝请求”):1(‘注册请求’、‘彻底检查’、‘检查票证’、‘决定’、‘拒绝请求’):1(‘注册请求’、‘彻底检查’、‘检查票证’、‘决定’、‘拒绝请求’):1(‘注册请求’、‘彻底检查’、‘检查票证’、‘决定’、‘拒绝请求’):1(‘注册请求’、‘彻底检查’、‘检查票证’、‘决定’、‘拒绝请求’):1’’但我希望这样(‘注册请求’、‘彻底检查’):1
Key:1 ---> case:concept:name concept:name
0 1 register request
1 1 examine thoroughly
2 1 check ticket
3 1 decide
4 1 reject request
<class 'pandas.core.frame.DataFrame'>
<class 'pandas.core.series.Series'>
Key:2 ---> case:concept:name concept:name
5 2 register request
6 2 check ticket
7 2 examine casually
8 2 decide
9 2 pay compensation
<class 'pandas.core.frame.DataFrame'>
<class 'pandas.core.series.Series'>
etc.
ser= df.groupby(["case:concept:name"]).apply(lambda g: tuple(g["concept:name"]))
print(ser.value_counts())
Output example:
(register request, examine thoroughly, check ticket, decide, reject request) 2
(register request, check ticket, examine thoroughly, decide, reject request) 1
ser2= pd.Series( [ p for t in ser for p in zip(t,t[1:]) ] )
print(ser2.value_counts().sort_index())
Output example:
(check ticket, decide) 7
(check ticket, examine casually) 2
(check ticket, examine thoroughly) 1