我有一个包含5个字段的数据框。我想从中复制2个字段到一个新的数据框中。这很好。 df1 = df[['task_id','duration']]
现在在此df1中,当我尝试按task_id
分组并求和duration
时,task_id
字段将消失。
之前(我现在拥有的)。
例如,我正在尝试:
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
的百分比。这看起来很简单,但是我什么也做不了。我该如何弄清楚呢?
答案 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)