![](/img/trans.png)
[英]Pandas transform dataframe using groupby when count of a string in a column is maximum
[英]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
我收集到我可以使用以下方法將每個日期的所有值除以該日期所有值的最小值: df['Value'] = df.groupby('Date')['Value'].transform(lambda x: x / x.min())
但是,這會將兩個組值集中在一起,而不是專門使用Cntrl
組來計算最小值。 有沒有辦法在 lambda 函數中嵌套一個額外的 groupby 調用,或者以不同的方式設置轉換來完成這個?
使用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
一種選擇是獲取Group
和Date
的 groupby 輸出,然后計算Value
列:
out = df.groupby(['Group', 'Date']).Value.min().loc['Cntrl']
df.assign(Value = df.Value/df.Date.map(out))
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.