代码之家  ›  专栏  ›  技术社区  ›  Jsevillamol

将数据帧行聚合到字典中

  •  1
  • Jsevillamol  · 技术社区  · 7 年前

    我有一个DataFrame对象,其中每一行代表图像中的一个对象。

    可能的行的一个示例是:

    {'img_filename': 'img1.txt', 'img_size':'20', 'obj_size':'5', 'obj_type':'car'}
    

    {'img_filename': 'img1.txt', 'img_size':'20', 'obj': [{'obj_size':'5', 'obj_type':'car'}, {{'obj_size':'6', 'obj_type':'bus'}}]}
    

    也就是说,第三列是包含每个组的数据的列的列表。

    我该怎么做?

    编辑:

    考虑下面的例子。

    import pandas as pd
    df1 = pd.DataFrame([
    {'img_filename': 'img1.txt', 'img_size':'20', 'obj_size':'5', 'obj_type':'car'}, 
    {'img_filename': 'img1.txt', 'img_size':'20', 'obj_size':'6', 'obj_type':'bus'}, 
    {'img_filename': 'img2.txt', 'img_size':'25', 'obj_size':'4', 'obj_type':'car'}
    ])
    
    df2 = pd.DataFrame([
    {'img_filename': 'img1.txt', 'img_size':'20', 'obj': [{'obj_size':'5', 'obj_type':'car'}, {'obj_size':'6', 'obj_type':'bus'}]},
    {'img_filename': 'img2.txt', 'img_size':'25', 'obj': [{'obj_size':'4', 'obj_type':'car'}]}
    ])
    

    df1 进入 df2 .

    2 回复  |  直到 7 年前
        1
  •  1
  •   Abhi    7 年前

    单向使用 to_dict

    df2 = df1.groupby('img_filename')['obj_size','obj_type'].apply(lambda x: x.to_dict('records'))
    df2 = df2.reset_index(name='obj')
    
    # Assuming you have multiple same img files with different sizes then I'm choosing first.
    # If this not the case then groupby directly and reset index.
    #df1.groupby('img_filename, 'img_size')['obj_size','obj_type'].apply(lambda x: x.to_dict('records'))
    
    df2['img_size'] = df1.groupby('img_filename')['img_size'].first().values
    
    print (df2)
    
      img_filename                                                obj img_size
    0     img1.txt  [{'obj_size': '5', 'obj_type': 'car'}, {'obj_s...       20
    1     img2.txt             [{'obj_size': '4', 'obj_type': 'car'}]       25
    
        2
  •  1
  •   Srce Cde    7 年前

    一艘班轮。

    img_filename 不同的 img_size join 价值。

      img_filename img_size obj_size obj_type
    0     img1.txt       20        5      car
    1     img1.txt       22        6      bus
    2     img2.txt       25        4      car
    
    # if you want to join the img_size of img1.txt like 20, 22
    df2 = df1.groupby("img_filename")["img_size", "obj_size", "obj_type"].apply(lambda x: pd.Series({"obj": x[["obj_size", "obj_type"]].to_json(orient="records"), "img_size": ','.join(x["img_size"])})).reset_index()
    

    输出:

      img_filename                                                obj img_size
    0     img1.txt  [{"obj_size":"5","obj_type":"car"},{"obj_size"...    20,22
    1     img2.txt                [{"obj_size":"4","obj_type":"car"}]       25
    

    考虑第一价值

    #if you want to consider only first value i.e. 20
    df2 = df1.groupby("img_filename")["img_size", "obj_size", "obj_type"].apply(lambda x: pd.Series({"obj": x[["obj_size", "obj_type"]].to_json(orient="records"), "img_size": x["img_size"].iloc[0]})).reset_index()
    

    输出:

      img_filename                                                obj img_size
    0     img1.txt  [{"obj_size":"5","obj_type":"car"},{"obj_size"...       20
    1     img2.txt                [{"obj_size":"4","obj_type":"car"}]       25