【问题标题】:How do I get the last n rows matching the last three unique values in a DataFrame?如何获取与 DataFrame 中最后三个唯一值匹配的最后 n 行?
【发布时间】:2021-09-16 22:18:56
【问题描述】:

我想获取最后一个 n 行,其中 ValueValue 列中的最后三个唯一值中的任何一个匹配。

这是一个示例数据帧:

df = {'Features':['A','A','A','A','C','C','C','C','B','B','B','B'],'Date':['1/3/2023','1/3/2022','1/3/2022','1/3/2021','1/3/2024','5/8/2020','5/8/2021','5/8/2022','6/1/2020','6/1/2019','5/8/2023','5/8/2023'],
'Value':[2,9,4,7,4,5,7,8,0,3,9,9]}
df=pd.DataFrame(df)

   Features Date    Value
0   A   1/3/2023    2
1   A   1/3/2022    9
2   A   1/3/2022    4
3   A   1/3/2021    7
4   C   1/3/2024    4
5   C   5/8/2020    5
6   C   5/8/2021    7
7   C   5/8/2022    8
8   B   6/1/2020    0
9   B   6/1/2019    3
10  B   5/8/2023    9
11  B   5/8/2023    9

例如,对于最后三个唯一值上方的示例数据,0, 3, 9 与最后 行匹配,因此所需的输出将是:

7   B   6/1/2020    0
8   B   6/1/2019    3
9   B   5/8/2023    9
10  B   5/8/2023    9

谁能帮我解决这个问题?

【问题讨论】:

  • 您说“最后三个”,但您想要的输出示例包括四个记录。
  • 我相信这是最后 3 个 。 0、3 和 9(只有 2 行有 9)@blorgon
  • 我的意思是,他们非常明确地说:“最后三个唯一的”三个不同的时间,一次在标题中,两次在正文中。我倾向于相信 OP 犯了一个错误。
  • "我想得到 0,3 和 9 的行",即 4 行。我可能是错的。只有 OP 可以确认。
  • @blorgon 很抱歉造成混乱。我已经更新了问题。

标签: python pandas numpy unique


【解决方案1】:

对于基于Value 列的唯一值,

>>> df.drop_duplicates(subset='Value').tail(3)
  Features      Date  Value
7        B  6/1/2020      0
8        B  6/1/2019      3
9        B  5/8/2023      9

【讨论】:

  • 没问题,这是一个不错的解决方案。
【解决方案2】:

删除重复行,从末尾获取第三个索引 (-3) 并将数据帧从该索引切到末尾 (:)

>>> df.loc[df.loc[~df.duplicated('Value')].index[-3]:]

   Features      Date  Value
7         B  6/1/2020      0
8         B  6/1/2019      3
9         B  5/8/2023      9
10        B  5/8/2023      9

【讨论】:

  • @HenryEcker。那么我应该将duplicated 子集化为仅“值”还是所有列?
  • 我不知道,这个例子似乎是一样的。 “获取 Value 列的最后三个唯一行”让我觉得它只依赖于值。我可能是错的。
【解决方案3】:

我们可以尝试从value 列中获取最后 3 个unique 值:

df['Value'].unique()
# [2 4 7 5 8 0 3 9]

最后三个唯一值是 0、3 和 9。

然后我们可以过滤 DataFrame 以仅包含具有这些值的行:

df[df['Value'].isin(df['Value'].unique()[-3:])]
   Features      Date  Value
7         B  6/1/2020      0
8         B  6/1/2019      3
9         B  5/8/2023      9
10        B  5/8/2023      9

【讨论】:

    猜你喜欢
    • 2013-01-17
    • 1970-01-01
    • 2021-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-30
    • 1970-01-01
    相关资源
    最近更新 更多