我有一个示例数据集:
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(DaysV),但跳过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
答案 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
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