【问题标题】:Keep only the final or the latest rev of a file name仅保留文件名的最终版本或最新版本
【发布时间】:2022-10-15 02:00:32
【问题描述】:

我有一个数据框,其列如下:

  Name                                                         Measurement
0 Blue_Water_Final_Rev_0                                             3
1 Blue_Water_Final_Rev_1                                             4
2 Blue_Water_Final_Rev_2                                             5
3 Red_Water_Final_Rev_0                                              7
4 Red_Water_Initial_Rev_0                                            6

如果另一个是“初始”,我只想保留具有最新转速的行或具有“最终”的行。 在上述情况下,我的输出将如下所示:

 Name                                                         Measurement
2 Blue_Water_Final_Rev_2                                             5
3 Red_Water_Final_Rev_0                                              7

如何在我的 pandas 数据框中的 python 中执行此操作?谢谢。

【问题讨论】:

  • 是否可能只有 Initial 而不是 Final 的行?

标签: python pandas numpy


【解决方案1】:

如果可能只存在Initial 而没有Final 并且需要保留它使用Series.str.extract 获取组的3 列,FinalInitial 和修订数,将最后一列转换为整数,然后按所有列排序使用DataFrame.sort_values 并通过DataFrame.duplicated 获取每组的最后一个副本:

print (df)
                        Name  Measurement
0     Blue_Water_Final_Rev_0            3
1     Blue_Water_Final_Rev_1            4
2     Blue_Water_Final_Rev_2            5
3      Red_Water_Final_Rev_0            7
4    Red_Water_Initial_Rev_0            6
5  Green_Water_Initial_Rev_0            6

df1 = (df['Name'].str.extract(r'(?P<a>w+)_(?P<b>Final|Initial)_Rev_(?P<c>d+)$')
                 .assign(c=lambda x: x.c.astype(int)))

df = df[~df1.sort_values(['a','c','b'], ascending=[True, True, False])
            .duplicated('a', keep='last')]
print (df)
                        Name  Measurement
2     Blue_Water_Final_Rev_2            5
3      Red_Water_Final_Rev_0            7
5  Green_Water_Initial_Rev_0            6

但是,如果需要删除所有Initial 并仅处理Final 行,则使用与上面相同的第一部分,然后才过滤掉带有Initial 的行,最后修订使用DataFrame.locDataFrameGroupBy.idxmax

df1 = (df['Name'].str.extract(r'(?P<a>w+)_(?P<b>Final|Initial)_Rev_(?P<c>d+)$')
                 .assign(c=lambda x: x.c.astype(int)))

df = df.loc[df1[df1.b.ne('Initial')].groupby('a')['c'].idxmax()]

print (df)
                     Name  Measurement
2  Blue_Water_Final_Rev_2            5
3   Red_Water_Final_Rev_0            7

【讨论】:

  • 当我按照您的步骤操作时,它会给出错误:无法将浮点 NaN 转换为整数。我的“名称”列中没有 NaN。另请参阅我的 cmets 到 mozway。我想保留最新版本的所有实例,而不是删除最新版本的副本。谢谢
【解决方案2】:

您可以使用keep='last' 提取“Final”和drop_duplicates 之前的名称:

keep = (df['Name']
        .str.extract('^(.*)_Final', expand=False)
        .drop_duplicates(keep='last')
        .dropna()
        )

out = df.loc[keep.index]

注意。假设数据按修订排序。

输出:

                     Name  Measurement
2  Blue_Water_Final_Rev_2            5
3   Red_Water_Final_Rev_0            7

如果要保留上一个修订版的所有副本:

out = df[df['Name'].isin(df.loc[keep.index, 'Name'])]

【讨论】:

  • 我应该更清楚。我的意图也是保留最新版本的所有外观。也就是说,如果有 3 行带有“Blue_Water_Final_Rev_2”,我希望保留所有三行,并且不删除此最新版本中的重复项。
  • @ukanafun 查看更新
【解决方案3】:

您可以为此使用 df.iloc[2:4,:]

【讨论】:

  • 嗨@Tharindu Kavinda 这不会解决问题,因为我有数百万行数据。我给出的表格只是一个例子,而不是实际的东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-11
  • 2019-12-11
  • 2020-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多