【问题标题】:Collapsing rows in a Pandas dataframe折叠 Pandas 数据框中的行
【发布时间】:2017-09-16 18:18:25
【问题描述】:

我正在尝试折叠数据框中的行,该数据框中包含一列 ID 数据和许多列,每个列都包含不同的字符串。看起来 groupby 是解决方案,但它似乎倾向于在组上执行一些数字功能 - 我只想保留文本。这就是我得到的...

我有一个表单的数据框:

index    ID     apples    pears    oranges
0        101                       oranges
1        134    apples
2        576              pears
3        837    apples
4        576                       oranges
5        134              pears

列是干净的:所以苹果列中只会有文本“apples”,否则它将是空白的。

如果同一 ID 下有多个条目(在本例中,在 ID 134 和 576 上),我想将这些行折叠在一起以获得以下信息:

index    ID     apples    pears    oranges
0        101                       oranges
1        134    apples    pears
2        576              pears    oranges
3        837    apples

我可以通过遍历行来做到这一点,但这似乎是一个非熊猫解决方案。有没有更好的办法?

【问题讨论】:

    标签: python-3.x pandas


    【解决方案1】:

    您可以将groupby 与聚合''.joinsummax 一起使用:

    #if blank values are NaN first replace to ''
    df = df.fillna('')
    
    df = df.groupby('ID').agg(''.join)
    print (df)
         apples  pears  oranges
    ID                         
    101                 oranges
    134  apples  pears         
    576          pears  oranges
    837  apples   
    

    同样有效:

    df = df.fillna('')
    df = df.groupby('ID').sum()
    #alternatively max
    #df = df.groupby('ID').max()
    print (df)
         apples  pears  oranges
    ID                         
    101                 oranges
    134  apples  pears         
    576          pears  oranges
    837  apples     
    

    如果需要删除每组和每列的重复项,请添加unique

    df = df.groupby('ID').agg(lambda x: ''.join(x.unique()))
    

    【讨论】:

    • 第一个建议效果很好。感谢您的帮助!您是否有机会描述以下行中发生的事情:df = df.groupby('ID').agg(''.join)
    【解决方案2】:

    假设空白是''

    选项 1
    pivot_table

    df.pivot_table(['apples', 'pears', 'oranges'], 'ID', aggfunc=''.join)
    

    选项 2
    sort 并取最后一行,因为 '' 将首先排序

    def f(df):
        return pd.DataFrame(np.sort(df.values, 0)[[-1]], [df.name], df.columns)
    
    df.set_index(
        'ID', append=True
    ).groupby(level='ID', group_keys=False).apply(f)
    

    两者都有

         apples  oranges  pears
    ID                         
    101          oranges       
    134  apples           pears
    576          oranges  pears
    837  apples                
    

    【讨论】:

      猜你喜欢
      • 2021-01-17
      • 2013-12-13
      • 2019-03-24
      • 2016-07-07
      • 2012-10-04
      • 2015-03-12
      • 1970-01-01
      • 1970-01-01
      • 2018-10-08
      相关资源
      最近更新 更多