【问题标题】:Selecting unique id,s count greater than a specified value选择大于指定值的唯一 id 计数
【发布时间】:2021-04-25 15:24:00
【问题描述】:

我有一个 Python Pandas 数据框,其中包含下面给出的数据示例。

  • 数据有多个唯一 ID,如第 2 列所示。我试图保留计数大于 20 的唯一/不同 ID 的数据。新的dataframe应该有unique_id大于20的数据,其余的忽略。
  • 例如,如果unqiue_id '105714'在数据中出现20次,则保留相关列的数据,否则忽略它。

我试过了:

df['unique_id'].value_counts().reset_index(name="count").query("count > 20")["unique_id"]

但它不起作用。

sample_data.csv

datetime,           unique_id,   Usage
2018-01-28 00:00:00, 105714,    409.365
2018-01-28 00:05:00, 105714,    409.18
2018-01-28 00:10:00, 105714,    2424.2399
2018-01-28 00:15:00, 105714,    225.4576
2018-01-28 00:20:00, 206714,    225.2768
2018-01-28 00:25:00, 105714,    2382.1309
2018-01-28 00:30:00, 305714,    410.685
2018-01-28 00:35:00, 108714,    317.1043

【问题讨论】:

  • 那么,您要删除所有具有出现少于 20 次的 unique_id 的行吗?
  • 您是否尝试过将groupbycount 一起使用并查询任何其他值大于20 的列df.groupby(['unique_id']).count().query("Usage > 20").index.values

标签: python python-3.x pandas dataframe pandas-groupby


【解决方案1】:

如果我明白你想要什么,这里有一个简单的分步方法

id_counts = df['unique_id'].value_counts()
ids_to_keep = id_counts[id_counts >= 20].index
df = df.loc[df['unique_id'].isin(ids_to_keep)]

【讨论】:

  • 与 callable 类似:ids_to_keep = df['unique_id'].value_counts().loc[lambda x: x>=20].index
  • @anky 太好了!不知道你可以将函数传递给.loc
【解决方案2】:

我认为在这种情况下,您可以使用groupby(['unique_id']) 来按unique_id 对所有行进行分组,并使用count() 函数计算每个组的出现次数。这将返回一个DataFrame,您可以使用它来查询结果并通过获取查询的数据框索引来获取满足条件的unique_id

df.groupby(['unique_id']).count().query("Usage > 20").index.values

【讨论】:

    【解决方案3】:

    另一种使用布尔索引的方法:

    df = df[df.groupby("unique_id")["unique_id"].transform("size") > 20]
    print(df)
    

    【讨论】:

    • 当我输入288而不是20时,上述解决方案不起作用。
    猜你喜欢
    • 1970-01-01
    • 2014-03-20
    • 2017-02-18
    • 1970-01-01
    • 2011-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多