Как я могу сохранить все столбцы в кадре данных, добавить группу и сумму? - PullRequest
0 голосов
/ 05 декабря 2018

У меня есть фрейм данных с 5 полями.Я хочу скопировать 2 поля из этого в новый фрейм данных.Это отлично работает.df1 = df[['task_id','duration']]

Теперь в этом df1, когда я пытаюсь сгруппировать по task_id и сумме duration, поле task_id исчезает.

До (что у меня сейчас).

enter image description here

После (чего я пытаюсь достичь).enter image description here

Так, например, я пытаюсь это:

df1['total'] = df1.groupby(['task_id'])['duration'].sum()

Результат:

A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy

Я надеваюне знаю, почему я не могу просто суммировать значения в столбце и группе по уникальным идентификаторам в другом столбце.По сути, все, что я хочу сделать, - это сохранить исходные два столбца (['task_id', 'duration']), сумму duration и вычислить процентную долю duration в новом столбце с именем pct.Это кажется очень простой вещью, но я ничего не могу заставить работать.Как я могу это исправить?

Ответы [ 3 ]

0 голосов
/ 05 декабря 2018

Настройка:

X = np.random.choice([0,1,2], 20)
Y = np.random.uniform(2,10,20)
df = pd.DataFrame({'task_id':X, 'duration':Y})

Рассчитать проц .:

df = pd.merge(df, df.groupby('task_id').agg(sum).reset_index(), on='task_id')
df['pct'] = df['duration_x'].divide(df['duration_y'])*100
df.drop('duration_y', axis=1) # Drops sum duration, remove this line if you want to see it.

Результат:

     duration_x  task_id        pct
0     8.751517        0  58.017921
1     6.332645        0  41.982079
2     8.828693        1   9.865355
3     2.611285        1   2.917901
4     5.806709        1   6.488531
5     8.045490        1   8.990189
6     6.285593        1   7.023645
7     7.932952        1   8.864436
8     7.440938        1   8.314650
9     7.272948        1   8.126935
10    9.162262        1  10.238092
11    7.834692        1   8.754639
12    7.989057        1   8.927129
13    3.795571        1   4.241246
14    6.485703        1   7.247252
15    5.858985        2  21.396850
16    9.024650        2  32.957771
17    3.885288        2  14.188966
18    5.794491        2  21.161322
19    2.819049        2  10.295091

disclaimer: Все данные генерируются случайным образом при настройке, однако расчеты просты и должны быть правильными для любого случая.

0 голосов
/ 06 декабря 2018

У меня наконец все заработало следующим образом.

# group by and sum durations
df1 = df1.groupby('task_id', as_index=False).agg({'duration': 'sum'})
list(df1)

# find each task_id as relative percentage of whole
df1['pct'] = df1['duration']/(df1['duration'].sum())
df1 = pd.DataFrame(df1)
0 голосов
/ 05 декабря 2018

Код позаботится о сохранении столбцов и получении суммы.

df[['task_id', 'duration']].groupby(['task_id', 'duration']).size().reset_index(name='counts')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...