【问题标题】:How to group this dataframe in python?如何在 python 中对这个数据框进行分组?
【发布时间】:2018-10-24 09:43:35
【问题描述】:

我有这个问题:

import pandas as pd

stripline = "----------------------------"

rawData = {
    'order number': ['11xa', '11xa', '11xa', '21xb', '31xc'],
    'working area': ['LLA', 'LLE', 'LLS', 'MLA', 'MLE'],
    'time': [1, 6, 13, 35, 24]
}

df = pd.DataFrame(rawData)
print("original data:")
print(df.head())

print(stripline)

rawData2 = {
    'order number': ['11xa', '21xb', '31xc'],
    'working area': ['LLS', 'MLA', 'MLE'],
    'time': [20, 35, 24]
}
df2 = pd.DataFrame(rawData2)

print("expected result:")
print("group after order number, sum all times to that order and choose working field with the biggest time")
print(df2.head())

如何操作我的数据框 df 以获取 df2?

我想总结时间列中与订单号相对应的所有值。我想使用时间最长的工作领域,特别是我想保留其余的数据。新的数据框有三阶,旧的一阶五阶。

【问题讨论】:

    标签: python pandas dataframe grouping data-manipulation


    【解决方案1】:
    import pandas as pd
    
    rawData = {
        'order_number': ['11xa', '11xa', '11xa', '21xb', '31xc'],
        'working_area': ['LLA', 'LLE', 'LLS', 'MLA', 'MLE'],
        'time': ['1', '6', '13', '35', '24']
        }
    
    df = pd.DataFrame(rawData)
    df['time'] = df['time'].apply(int) 
    df = df.groupby('order_number', as_index=False).apply(lambda g: g.assign(sum=g.time.sum()))
    df.groupby('order_number', ascending=False).apply(lambda x: x.sort_values('time').head(1)).reset_index(drop=True)
    

    给你

      order_number working_area  time  sum
    0         11xa          LLA     1   20
    1         21xb          MLA    35   35
    2         31xc          MLE    24   24
    

    【讨论】:

    • 不,这给出了一个包含两列(工作区域)的数据框。如果我使用 df.groupby('order number',)['time'].sum() 我有同样的问题。请看看我的 print(df2) 这是它的样子
    • 不幸的是,我不清楚,你想实现什么? '11xa' 具有工作区 'LLA''LLE'。因此,要么忽略它(第一个代码 sn-p),要么考虑(第二个代码 sn-p)。
    • 请再次运行我的代码。订单号为 11xa。有与该订单号对应的三个任务。任务 LLA、LLE 和 LLS。我总结了与此顺序相对应的所有时间,即 20,并选择具有最高时间值的工作字段。由于示例中的 13 分钟,因此工作字段为 LLS。特别是我需要保留其余的数据。请运行演示代码以了解我的意思。
    • 更新并更正了解决方案。可能有更聪明的解决方案,但它可以正常工作。
    【解决方案2】:
    rawData = {
        'order number': ['11xa', '11xa', '11xa', '21xb', '31xc'],
        'working area': ['LLA', 'LLE', 'LLS', 'MLA', 'MLE'],
        'time': ['1', '6', '13', '35', '24']
    }
    
    dataframe = pd.DataFrame(rawData)
    dataframe['time'] = dataframe['time'].astype(int)
    dataframe.groupby(['order number']).sum().reset_index()
    

    输出

    order number    time
    0     11xa     20
    1     21xb     35
    2     31xc     24
    

    【讨论】:

      【解决方案3】:

      尝试这样,您可以使用agg 来执行此操作:(nb:列名的小变化):

      rawData = {
          'order_number': ['11xa', '11xa', '11xa', '21xb', '31xc'],
          'working_area': ['LLA', 'LLE', 'LLS', 'MLA', 'MLE'],
          'time': ['1', '6', '13', '35', '24']
          }
      
      df = pd.DataFrame(rawData)
      df['time'] = df['time'].apply(int)  
      df = df.sort_values(['time'], ascending=True)
      
      df = df.groupby(['order_number'], as_index=False).agg(dict(working_area='last', time='sum'))
      

      输出:

         order_number  time working_area
      0         11xa    20          LLS
      1         21xb    35          MLA
      2         31xc    24          MLE
      

      【讨论】:

        猜你喜欢
        • 2022-09-23
        • 1970-01-01
        • 1970-01-01
        • 2020-04-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-13
        • 1970-01-01
        相关资源
        最近更新 更多