Python 基于唯一id的文本列分组依据

Python 基于唯一id的文本列分组依据,python,pandas,pandas-groupby,Python,Pandas,Pandas Groupby,我有下面的csv文件 itemid testresult duplicateid 100 textboxerror 0 101 text_input_issue 100 102 menuitemerror 0 103 text_click_issue 100 104 text_caps_error 100 105 menu_drop_down_erro

我有下面的csv文件

itemid  testresult      duplicateid
100     textboxerror            0
101     text_input_issue        100
102     menuitemerror           0
103     text_click_issue        100
104     text_caps_error         100
105     menu_drop_down_error    102
106     text_lower_error        100
107     menu_item_null          102
我想基于duplicateid将上表testreslts转换为两列,结果列为similartestresults,示例表需要如下所示

所需数据帧:

index   testresult     similartestresults   duplicateid
1       textboxerror    text_click_issue        100
2       textboxerror    text_caps_error         100
3       textboxerror    text_caps_error         100
4       textboxerror    text_lower_error        100
5       menuitemerror   menu_drop_down_error    102
6       menuitemerror   menu_item_null          102
我尝试使用pandas groupby,但它只给出一个列表,代码如下

df1 =  df.groupby(["duplicateid", "testresult"])
print (df1)
print (df1.groups)

df['similartestresults'] = df.groupby("duplicateid")['testresult'].apply(lambda tags: ','.join(tags))
print (df2)
但上述两种方法均未给出预期结果。请对此提出建议。 谢谢
TSJ

复制测试结果列,并使用前四个字符作为组名对其进行更新。将其替换为最终的组名。然后删除不必要的列并重新排序。这符合你问题的意图吗

df['simlartestresult'] = df['testresult'].copy()

# Update to group_name 
df['testresult'] = df['simlartestresult'].apply(lambda x: x[:4])
df['testresult'].replace(['text','menu'],['textboxerror','menuitemerror'],inplace=True)

# delete 'dupulicateid = 0'
df = df[~(df['duplicateid'] == 0)]
df = df.sort_values('duplicateid', ascending=True)

df
    itemid  testresult  duplicateid simlartestresult
1   101 textboxerror    100 text_input_issue
3   103 textboxerror    100 text_click_issue
4   104 textboxerror    100 text_caps_error
6   106 textboxerror    100 text_lower_error
5   105 menuitemerror   102 menu_drop_down_error
7   107 menuitemerror   102 menu_item_null

复制测试结果列,并使用前四个字符作为组名对其进行更新。将其替换为最终的组名。然后删除不必要的列并重新排序。这符合你问题的意图吗

df['simlartestresult'] = df['testresult'].copy()

# Update to group_name 
df['testresult'] = df['simlartestresult'].apply(lambda x: x[:4])
df['testresult'].replace(['text','menu'],['textboxerror','menuitemerror'],inplace=True)

# delete 'dupulicateid = 0'
df = df[~(df['duplicateid'] == 0)]
df = df.sort_values('duplicateid', ascending=True)

df
    itemid  testresult  duplicateid simlartestresult
1   101 textboxerror    100 text_input_issue
3   103 textboxerror    100 text_click_issue
4   104 textboxerror    100 text_caps_error
6   106 textboxerror    100 text_lower_error
5   105 menuitemerror   102 menu_drop_down_error
7   107 menuitemerror   102 menu_item_null

谢谢你的回答。我需要基于duplicateid创建类似的测试结果。这里,duplicateid 100表示itemid 101的testresult字符串类似于itemid 100(textboxerror)。因此,itemid101103104和106类似于itemid100文本(textboxerror)。因此,在“testresult”列中,我希望保留基本文本100和102字符串,同时在“similartestresults”列中,我希望保留类似的文本字符串。此外,我希望在数据帧中保留duplicateid 0行。因此,这里需要通过duplicateid和itemid列进行主要比较。谢谢。“itemid”的角色不清楚,所以我把它放在原处了。我很高兴你觉得它有用。如果您对此答案感到满意,请接受。感谢您的回答。我需要基于duplicateid创建类似的测试结果。这里,duplicateid 100表示itemid 101的testresult字符串类似于itemid 100(textboxerror)。因此,itemid101103104和106类似于itemid100文本(textboxerror)。因此,在“testresult”列中,我希望保留基本文本100和102字符串,同时在“similartestresults”列中,我希望保留类似的文本字符串。此外,我希望在数据帧中保留duplicateid 0行。因此,这里需要通过duplicateid和itemid列进行主要比较。谢谢。“itemid”的角色不清楚,所以我把它放在原处了。我很高兴你觉得它有用。如果你对这个答案感到满意,请接受它。