我有一个 df 如下:
df_in
G1 G2 TPE QC
A S1 td 2
A S1 ts 4
A S2 td 6
A S2 ts 3
B S1 td 20
B S1 ts 40
B S2 td 60
B S2 ts 30
C S1 td 90
D S2 ts 7
因此输出应按 G1 和 G2 列进行分组,并且对于每个这样的组,对 QC 列,如 (ts/td),其中 TPE 列的值为 td 和 ts,并将 TPE 列中的新变量重命名为 比率。它还应按原样包含原始行。还应该注意的是,对于 TPE 列,某些组可能没有 ts 和 td 值。在这种情况下,将没有比率或比率应保留为空白。
所以输出应该是这样的:
df_out
G1 G2 TPE QC
A S1 td 2
A S1 ts 4
A S2 td 6
A S2 ts 3
B S1 td 20
B S1 ts 40
B S2 td 60
B S2 ts 30
C S1 td 90
D S2 ts 7
A S1 ratio 2
A S2 ratio 0.5
B S1 ratio 2
B S2 ratio 0.5
C S1 ratio
D S2 ratio
我尝试了以下方法,但它省略了 C 组和 D 组的空白值和空白比率:
def calculate_ratio(group):
td_row = group[group['TPE'] == 'td']
ts_row = group[group['TPE'] == 'ts']
if not td_row.empty and not ts_row.empty:
ratio = ts_row['QC'].values[0] / td_row['QC'].values[0]
return pd.DataFrame({'G1': [group['G1'].iloc[0]],
'G2': [group['G2'].iloc[0]],
'TPE': ['ratio'],
'QC': [ratio]})
return pd.DataFrame()
grouped = df_in.groupby(['G1', 'G2']).apply(calculate_ratio).reset_index(drop=True)
df_out = pd.concat([df_in, grouped], ignore_index=True)
任何帮助将不胜感激。
代码
tmp = df_in.set_index(['G1', 'G2', 'TPE']).unstack()['QC']
out = pd.concat([df_in, tmp['ts'].div(tmp['td']).reset_index(name='QC').assign(TPE='ratio')])
输出:
G1 G2 TPE QC
0 A S1 td 2.0
1 A S1 ts 4.0
2 A S2 td 6.0
3 A S2 ts 3.0
4 B S1 td 20.0
5 B S1 ts 40.0
6 B S2 td 60.0
7 B S2 ts 30.0
8 C S1 td 90.0
9 D S2 ts 7.0
0 A S1 ratio 2.0
1 A S2 ratio 0.5
2 B S1 ratio 2.0
3 B S2 ratio 0.5
4 C S1 ratio NaN
5 D S2 ratio NaN
中级
tmp:
TPE td ts
G1 G2
A S1 2.0 4.0
S2 6.0 3.0
B S1 20.0 40.0
S2 60.0 30.0
C S1 90.0 NaN
D S2 NaN 7.0