python - 如何根据 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_num和site_num的最后一个测试值。因此,如果任何数量的站点的某些test_num和site_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,那就太好了。
解决方案
这是您在问题中寻找的内容的工作示例。
#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'])
如果这不是您要查找的内容,请更详细地更新您的问题。
推荐阅读
- javascript - 你能在 JS 正则表达式中前向引用一个命名的捕获组吗?
- flutter - MacOS 新手 - 无法从 CMD 运行颤振命令?
- discord.py - 我无法在某些不和谐频道中激活我的代码
- python - 如何在没有分隔符的熊猫的情况下拆分列
- amazon-cloudfront - 如何将 lambda 连接到 CloudFront?AWS CDK JS
- vue.js - 是否有必要为一个页面中的单个调用创建一个 ui 组件?
- flutter - VideoPlayerController Flutter 中的位置
- firebase - 登录后未导航到主页
- gradle - 现有项目的 Intellij Gradle 模块依赖项显示编译错误
- google-sheets - 谷歌表格通过具有第一个单元格地址和长度来获取范围