【问题标题】:Grouping similar items in Pandas在 Pandas 中对类似项目进行分组
【发布时间】:2020-12-03 20:02:21
【问题描述】:

我正在尝试做某事,我想知道这是否可以在 Pandas 中完成,或者是否有更好的工具来完成这项工作(目前我只是使用直接 python)。这是起始数据:

# We have a listing of files for the movie Titanic
# And we want to break them into groups of similar titles,
# To see which of those are possible duplicates.
import pandas as pd
titanic_files = [
    {"File": "Titanic_HD2398.mov",  "Resolution": "HD", "FrameRate": 23.98, "Runtime": 102},
    {"File": "Titanic1.mov",        "Resolution": "SD", "FrameRate": 23.98, "Runtime": 102},
    {"File": "Titanic1.mov",        "Resolution": "HD", "FrameRate": 23.98, "Runtime": 102},
    {"File": "Titanic.mov",         "Resolution": "HD", "FrameRate": 24.00, "Runtime": 103},
    {"File": "MY_HD2398.mov",       "Resolution": "HD", "FrameRate": 23.98, "Runtime": 102}
]
df = pd.DataFrame(titanic_files)

我想按相似的数据对这些文件进行分组,从不折叠行级数据,例如:

  1. 第 1 步 -- 按分辨率分组

    
    ---- HD ----
    File               Resolution             FrameRate              RunTime
    Titanic_HD2398.mov HD                     23.98                  102
    Titanic1.mov       HD                     23.98                  102
    Titanic.mov        HD                     24.00                  103
    MY_HD2398.mov      HD                     23.98                  102
    
    ---- SD ----
    File               Resolution             FrameRate              RunTime
    Titanic1.mov       SD                     23.98                  102
    
  2. 第 2 步 -- 按帧率分组

    ---- HD -----------------------
     +----------- 23.98 ------------
    File               Resolution             FrameRate              RunTime
    Titanic_HD2398.mov HD                     23.98                  102
    Titanic1.mov       HD                     23.98                  102
    MY_HD2398.mov      HD                     23.98                  102
    
     +----------- 24.00 ------------
    File               Resolution             FrameRate              RunTime
    Titanic.mov        HD                     24.00                  103
    
    
    ---- SD -----------------------
     + ---------- 23.98 ------------
    
    File               Resolution             FrameRate              RunTime
    Titanic1.mov       SD                     23.98                  102
    

最后,我想为每个最小的分组提供单独的数据框。在python中,我目前正在使用以下数据结构进行此操作:

{
   'GroupingKeys': [{File1WithinThatBucket}, {File2WithinThatBucket}, ...]
}

例如:

{
   'HD+23.98' + [{'File': ...}],
   'HD+24.00' + [{'File': ...}]
}

另外,请记住,我要分组的字段大约有 10-15 个,我刚刚在上述问题中包含了两个,所以这种方法需要非常概括(另外,一些匹配标准不准确,例如运行时可能会被存储在 +/- 2 秒之类的范围内,某些值可能为空,等等)。

回到最初的问题:在 Pandas 中可以做这样的事情吗?如果可以,怎么做?

【问题讨论】:

    标签: python pandas group-by aggregation


    【解决方案1】:

    Pandas 的groupby 似乎是要使用的工具,它可以根据需要使用任意数量的 groupers,它们可以是 list、series、column_name、index_level、callable 类型的......你可以命名它

    例如你可以这样做:

    df = df.groupby(
        [
            'Resolution', df.FrameRate//0.02 * 0.02,
            pd.cut(df.Runtime, bins=[45, 90, 95, 100, 120])
        ]
    ).File.apply(list)
    

    这将返回一个具有 3 级和一列的唯一 MultiIndex 的 DataFrame,每行包含一个文件名列表。

    如果出于某种原因,您还可以获取每个组的完整行,使用其他数据,您希望将一个 df 拆分为多个并保持这种方式。

    for group_id, group_rows in df.groupby(...):
        # group id are tuples each with a unique combination of the grouping vectors
        # group_rows is a df of the matching rows, with the same columns as df
    

    【讨论】:

    • 结束 ] 应该在哪里?我从上面得到invalid syntax(没有关闭])。
    • 我打字没问题,进行了编辑以更清楚地显示结构
    • 太好了,感谢您的更新。关于答案的几个问题:.File 是什么——我以前从未见过?其次,为什么//0.02 *0.02 被黑?
    • 数据框的所有列都可以作为属性访问(除非列名是 df 的定义方法,如 sum、mean 等)返回一个系列。楼层划分只是将修改后的系列用作石斑鱼的示例,无需修改原始df。
    • 哦,我明白了!我认为.File 是数据帧上的一种方法,但我发现这只是我拥有的一个字段......现在更有意义了。
    猜你喜欢
    • 1970-01-01
    • 2014-07-23
    • 1970-01-01
    • 2012-09-06
    • 2016-10-28
    • 1970-01-01
    • 2015-02-23
    • 2011-04-04
    相关资源
    最近更新 更多