【问题标题】:Merging Pandas dataFrame rows合并 Pandas 数据帧行
【发布时间】:2018-08-06 05:30:25
【问题描述】:

我有一个看起来像这样的 Pandas DataFrame:

Time Image_names
0    [a,b,c,d]
0    [a,c,d,e]
0    [c,d,e,f]
1    [e,f,g,h]
1    [f,g,h,i]

我希望获得:给定时间的所有唯一图像名称

Time Image_names
0    [a,b,c,d,e]
1    [e,f,g,h,i]

我不确定是否必须使用 groupby 或 joins。

T

【问题讨论】:

  • 来自@jpp,您只需要: df.groupby('Time')['Image_names'].apply(lambda x: set(chain.from_iterable(x)))

标签: python pandas dataframe merge


【解决方案1】:

一种方法是使用itertools.chain:

from itertools import chain
import pandas as pd


df = pd.DataFrame({'Time': [0, 0, 0, 1, 1],
                   'Image_names': [['a', 'b', 'c', 'd'],
                                   ['a', 'c', 'd', 'e'],
                                   ['c', 'd', 'e', 'f'],
                                   ['e', 'f', 'g', 'h'],
                                   ['f', 'g', 'h', 'i']]})

df = df.groupby('Time')['Image_names'].apply(chain.from_iterable).map(set).reset_index()

#    Time         Image_names
# 0     0  {c, a, f, d, e, b}
# 1     1     {g, h, f, e, i}

说明

  • 应用chain.from_iterable 会将每个组中的列表合并为每个组的一个大列表。
  • 映射set 然后为每个组创建一个集合。
  • reset_index 确保结果是带有列标题的数据框。

【讨论】:

    【解决方案2】:

    您可以使用以下内容:

    import pandas as pd
    import numpy as np
    
    a=pd.DataFrame([[0,['a','b','c','d']],[0,['a','c','d','e']],
                    [0,['c','d','e','f']],[1,['e','f','g','h']],
                    [1,['f','g','h','i']]],
                    columns=['Time','Image_names'])
    a.groupby('Time')['Image_names'].sum().apply(np.unique)
    
    #Out[242]: 
    #Time
    #0    [a, b, c, d, e, f]
    #1       [e, f, g, h, i]
    #Name: Image_names, dtype: object
    

    【讨论】:

      【解决方案3】:

      您可以使用set

      s=df.groupby('Time',as_index=False).Image_names.sum()
      s.Image_names=list(map(set,s.Image_names))
      s
      Out[2034]: 
         Time         Image_names
      0     0  {b, c, d, a, f, e}
      1     1     {g, h, f, i, e}
      

      【讨论】:

      • 这很好用!但是,一旦我使用 df.to_csv("resultsDf.csv") 将此数据写入 CSV,Images_names 就会显示为 set([b,c,d,a,f,e])
      • @JagannathSaragadam 添加 s.Image_names=s.Image_names.apply(list) 然后 to_csv :-)
      猜你喜欢
      • 1970-01-01
      • 2022-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-23
      • 2016-10-17
      • 1970-01-01
      • 2022-01-07
      • 1970-01-01
      相关资源
      最近更新 更多