如何将所有列保留在数据框中,以及添加groupby和sum?

时间:2018-12-05 18:14:18

标签: python python-3.x pandas

我有一个包含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

我不知道为什么我不能只对一列中的值求和,然后对另一列中的唯一ID进行分组。基本上,我要做的就是保留原始的两列(['task_id', 'duration']),求和duration并在名为duration的新列中计算pct的百分比。这看起来很简单,但是我什么也做不了。我该如何弄清楚呢?

3 个答案:

答案 0 :(得分:1)

代码将负责保留列并获取总和。

df[['task_id', 'duration']].groupby(['task_id', 'duration']).size().reset_index(name='counts')

答案 1 :(得分:0)

设置:

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

计算pct:

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:所有数据都是在设置过程中随机生成的,但是计算很简单,在任何情况下都应该正确。

答案 2 :(得分:0)

我终于可以按照以下方式工作。

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