使用嵌套的 groupby 命令转换 pandas 中的列
using nested groupby commands to transform column in pandas
我有以下简单的数据框。
data = [['Cntrl', 0.844961, '201030'],
['Cntrl', 0.815331, '201030'],
['Exp', 1.530297, '201030'],
['Exp', 2.36416, '201030'],
['Cntrl', 1.867359, '201024'],
['Cntrl', 1.274295, '201024'],
['Exp', 0.7058, '201024'],
['Exp', 2.657393, '201024'],]
df = pd.DataFrame(data, columns=['Group', 'Value', 'Date'])
df
Group Value Date
0 Cntrl 0.844961 201030
1 Cntrl 0.815331 201030
2 Exp 1.530297 201030
3 Exp 2.364160 201030
4 Cntrl 1.867359 201024
5 Cntrl 0.705800 201024
6 Exp 1.274295 201024
7 Exp 2.657393 201024
我想将每个日期的值除以该日期的最小 Cntrl
值,得到:
Group Value Date
0 Cntrl 1.0363 201030
1 Cntrl 1.0000 201030
2 Exp 1.8769 201030
3 Exp 2.8996 201030
4 Cntrl 1.4654 201024
5 Cntrl 1.0000 201024
6 Exp 0.5538 201024
7 Exp 2.0853 201024
我收集到我可以将每个日期的所有值除以该日期的 all 所有值的最小值,使用:
df['Value'] = df.groupby('Date')['Value'].transform(lambda x: x / x.min())
但是,这会将两个组的值合并在一起,而不是专门使用 Cntrl
组来计算最小值。有没有办法将额外的 groupby 调用嵌套到 lambda 函数中,或者以不同的方式设置转换来完成此操作?
用 reindex
做 groupby
df.Value /= df[df['Group'].eq('Cntrl')].groupby('Date')['Value'].min().reindex(df['Date']).values
df
Out[172]:
Group Value Date
0 Cntrl 1.036341 201030
1 Cntrl 1.000000 201030
2 Exp 1.876903 201030
3 Exp 2.899632 201030
4 Cntrl 1.465406 201024
5 Cntrl 1.000000 201024
6 Exp 0.553875 201024
7 Exp 2.085383 201024
我有以下简单的数据框。
data = [['Cntrl', 0.844961, '201030'],
['Cntrl', 0.815331, '201030'],
['Exp', 1.530297, '201030'],
['Exp', 2.36416, '201030'],
['Cntrl', 1.867359, '201024'],
['Cntrl', 1.274295, '201024'],
['Exp', 0.7058, '201024'],
['Exp', 2.657393, '201024'],]
df = pd.DataFrame(data, columns=['Group', 'Value', 'Date'])
df
Group Value Date
0 Cntrl 0.844961 201030
1 Cntrl 0.815331 201030
2 Exp 1.530297 201030
3 Exp 2.364160 201030
4 Cntrl 1.867359 201024
5 Cntrl 0.705800 201024
6 Exp 1.274295 201024
7 Exp 2.657393 201024
我想将每个日期的值除以该日期的最小 Cntrl
值,得到:
Group Value Date
0 Cntrl 1.0363 201030
1 Cntrl 1.0000 201030
2 Exp 1.8769 201030
3 Exp 2.8996 201030
4 Cntrl 1.4654 201024
5 Cntrl 1.0000 201024
6 Exp 0.5538 201024
7 Exp 2.0853 201024
我收集到我可以将每个日期的所有值除以该日期的 all 所有值的最小值,使用:
df['Value'] = df.groupby('Date')['Value'].transform(lambda x: x / x.min())
但是,这会将两个组的值合并在一起,而不是专门使用 Cntrl
组来计算最小值。有没有办法将额外的 groupby 调用嵌套到 lambda 函数中,或者以不同的方式设置转换来完成此操作?
用 reindex
groupby
df.Value /= df[df['Group'].eq('Cntrl')].groupby('Date')['Value'].min().reindex(df['Date']).values
df
Out[172]:
Group Value Date
0 Cntrl 1.036341 201030
1 Cntrl 1.000000 201030
2 Exp 1.876903 201030
3 Exp 2.899632 201030
4 Cntrl 1.465406 201024
5 Cntrl 1.000000 201024
6 Exp 0.553875 201024
7 Exp 2.085383 201024