首页 > 解决方案 > 如何根据 Pandas 数据框中的某些列仅保留最后一个条目?

问题描述

我有一个如下所示的数据框,其中包含以下列 - TEST_NUM、SITE_NUM、HEAD_NUM、RESULT

这是其中的示例数据-

________________________________________ 
TEST_NUM | HEAD_NUM | SITE_NUM | RESULT
________________________________________ 
10000   |  1          | 0       |  P
________________________________________ 
10000   |  1          | 1       |  F          --> Should be retest, as result is F
________________________________________ 
10000   |  1          | 2       |  F          ---> Should be retest, as result is F
________________________________________ 
10000   |  1          | 3       |  P 
________________________________________ 
10000   |  1          | 1       |  P          ----> Retest done, finally Pass
________________________________________ 
10000   |  1          |  2      |  P          ----> Retest done, finally Pass

上述数据是来自在 4 个站点 {0,1,2,3} 上工作的测试设备的数据。正如您在上面的数据框中看到的那样,如果站点失败,则会进行重新测试,它可以通过或仍然失败。如果故障再次发生,则再次重新测试该站点。

我想从数据框中获取该特定test_numsite_num的最后一个测试值。因此,如果任何数量的站点的某些test_numsite_num再次出现在以下行中,则最终数据框应该具有最后一条记录。

所以,上面的数据框应该是这样的 -

==Desired result===

TEST_NUM | HEAD_NUM | SITE_NUM | RESULT
________________________________________ 
10000   |  1          | 0       |  P
________________________________________ 
10000   |  1          | 1       |  P          ----> Replaced the row
________________________________________ 
10000   |  1          | 2      |  P           ----> Replaced the row
________________________________________ 
10000   |  1          | 3       |  P 
________________________________________ 

理想情况下,行应按正确的顺序排列。就像任何 test_num 一样,站点 0,然后是 1,然后是数字 2,然后是 3。

如果来自特定站点的最后一条记录不能按原始顺序排列(或者如果它太乱),也可以使用以下结果。

==Result which can also do the trick===

TEST_NUM | HEAD_NUM | SITE_NUM | RESULT
________________________________________ 
10000   |  1          |  0       |  P
________________________________________ 
10000   |  1          |  3       |  P 
________________________________________ 
10000   |  1          |  1       |  P         ----> Not in the correct order but ok
________________________________________ 
10000   |  1          |  2      |  P          ---->  Kept the last, not in the original order but ok.

我试过的——

在从文本文件中解析上述数据框时,我尝试维护 3 个变量(old_site、old_site、old_testnum)。在从文本文件创建每一行期间,我检查当前 site_num 是否与 old_site 值相同,以及 old_testnum 值是否与当前 testnum 值相同。如果是这种情况,我从列表中弹出最后插入的值(列表用于在所有解析后创建数据帧),然后将当前值插入列表中,因此只保留最后一个值。但是我做了一个很大的假设,即重复值出现在原始记录之后,在这里可以看出不是这种情况[SITE_NUM = 1 的重复值出现在 2 SITE(site 2,3)] 之后。

任何人都可以建议任何方式可以获得期望的结果(期望的结果),或其他可能的可接受的格式?如果存在任何可以使其优雅的 API,那就太好了。

标签: pythonpandasdataframenumpy

解决方案


这是您在问题中寻找的内容的工作示例。

#Reproducing dataframe
df = pd.DataFrame() 
df['TEST_NUM'] = [10000,10000, 10000, 10000, 10000, 10000] 
df['HEAD_NUM'] = [1,1,1,1,1,1]
df['SITE_NUM'] = [0,1,2,3,1,2]
df['RESULT'] = ['P', 'F', 'F', 'P', 'P', 'P'] 

df = df.drop_duplicates(['TEST_NUM', 'SITE_NUM'], keep='last')
df = df.sort_values('SITE_NUM')

我刚刚阅读了您的评论,据我了解,您还有另一列“test_txt”是一个额外的列,您希望删除重复项然后排序,主要使用“test_txt”列。

df = df.drop_duplicates(['test_txt', 'TEST_NUM', 'SITE_NUM'], keep='last')
df = df.sort_values('SITE_NUM')
df = df.sort_values(['test_txt', 'SITE_NUM'])

如果这不是您要查找的内容,请更详细地更新您的问题。


推荐阅读