通过pandas python计算具有group的行的特定子集

时间:2017-05-15 16:01:14

标签: python pandas

我有一个示例数据集:

import pandas as pd
d = {
 'unit': ['UD', 'UD', 'UD', 'UD', 'UD','UD','UC','UC', 'UC', 'UC','UC','UC'],
 'N-D': [ 'Q1', 'Q2', 'Q3', 'Q4','Q5','Q6','Q1', 'Q2', 'Q3', 'Q4','Q5','Q6'],
 'casenumber': [1, 2, 3, 4, 5, 6,7,8,9,10,11],
 'DaysV' : [11, 12, 13, 14, 15, 16, 17,18,19,20,21]

}
df = pd.DataFrame(d)
df = df.reindex_axis(['unit','N-D','casenumber','DaysV'], axis=1)  #rearranging column order

看起来像这样,我为了说明目的简化了数字:

  unit N-D  casenumber  DaysV
   UD  Q1           1     14
   UD  Q2           2     15
   UD  Q3           3     16
   UD  Q4           4     17
   UD  Q5           5     18
   UD  Q6           6     19
   UC  Q1           7     20
   UC  Q2           8     21
   UC  Q3           9     22
   UC  Q4          10     23
   UC  Q5          11     24
   UC  Q6          12     25

我希望为每个'单位'为'N-D'设置2个新行(casenumber)和sum(Da​​ysV),但跳过Q3。 欲望输出:

  unit N-D  casenumber  DaysV
   UD  Q1           1     14
   UD  Q2           2     15
   UD  Q3           3     16
   UD  Q4           4     17
   UD  Q5           5     18
   UD  Q6           6     19
   UD SUM(Q1,Q2)    3     29
   UD SUM(Q4,Q5,Q6) 15    54
   UC  Q1           7     20
   UC  Q2           8     21
   UC  Q3           9     22
   UC  Q4           10    23
   UC  Q5           11    24
   UC  Q6           12    25
   UC SUM(Q1,Q2)    15    41
   UC SUM(Q4,Q5,Q6) 33    72

1 个答案:

答案 0 :(得分:1)

d = {
 'unit': ['UD', 'UD', 'UD', 'UD', 'UD','UC', 'UC', 'UC','UC','UC'],
 'N-D': [ 'Q1', 'Q2', 'Q3', 'Q4','Q5','Q1', 'Q2', 'Q3', 'Q4','Q5'],
 'casenumber': [1, 2, 3, 4, 5, 6,7,8,9,10],
 'DaysV' : [11, 12, 13, 14, 15, 16, 17,18,19,20]

}
df = pd.DataFrame(d)
df = df.reindex_axis(['unit','N-D','casenumber','DaysV'], axis=1) 

df = df.assign(group=np.where(df['N-D'].isin(['Q1','Q2']),'Sum(Q1,Q2)',np.where(df['N-D'].isin(['Q4','Q5']),'Sum(Q4,Q5)',np.nan)))

df_out = pd.concat([df.drop('group',axis=1),
          df.groupby(['unit','group']).sum().reset_index().query('group != "nan"').rename(columns={'group':'N-D'})])

输出:

  unit         N-D  casenumber  DaysV
0   UD          Q1           1     11
1   UD          Q2           2     12
2   UD          Q3           3     13
3   UD          Q4           4     14
4   UD          Q5           5     15
5   UC          Q1           6     16
6   UC          Q2           7     17
7   UC          Q3           8     18
8   UC          Q4           9     19
9   UC          Q5          10     20
0   UC  Sum(Q1,Q2)          13     33
1   UC  Sum(Q4,Q5)          19     39
3   UD  Sum(Q1,Q2)           3     23
4   UD  Sum(Q4,Q5)           9     29

EDIT添加了排序

df_out.sort_values(by=['unit','N-D'])

输出:

  unit         N-D  casenumber  DaysV
5   UC          Q1           6     16
6   UC          Q2           7     17
7   UC          Q3           8     18
8   UC          Q4           9     19
9   UC          Q5          10     20
0   UC  Sum(Q1,Q2)          13     33
1   UC  Sum(Q4,Q5)          19     39
0   UD          Q1           1     11
1   UD          Q2           2     12
2   UD          Q3           3     13
3   UD          Q4           4     14
4   UD          Q5           5     15
3   UD  Sum(Q1,Q2)           3     23
4   UD  Sum(Q4,Q5)           9     29