Как сгруппировать этот dataframe в python? - PullRequest
0 голосов
/ 24 октября 2018

У меня есть эта проблема:

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())

Как я могу манипулировать моим df2 кадра данных, чтобы получить df2?

Я хочу суммировать все значения в столбце времени, которые соответствуютпорядковый номер.Я хочу использовать рабочее поле с наибольшим временем, и особенно я хочу сохранить оставшиеся данные.Новый фрейм данных имеет три порядка, старый пять.

Ответы [ 3 ]

0 голосов
/ 24 октября 2018
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
0 голосов
/ 25 октября 2018

Попробуйте вот так, вы можете использовать agg для этого: (примечание: небольшие изменения в именах столбцов):

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
0 голосов
/ 24 октября 2018
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
...