我有一个数据框,我想在组中找到列的最小值,然后根据该行更新其他一些列的值。
以下代码可以满足我的需求:
import pandas as pd
df = pd.DataFrame({'ID': [1,1,1,2,2,2,],
'Albedo': [0.2, 0.4, 0.5, 0.3, 0.5, 0.1],
'Temp' : [20, 30, 15, 40, 10, 5],
'Precip': [200, 100, 150, 60, 110, 45],
'Year': [1950, 2000, 2004, 1999, 1976, 1916]})
#cols to replace values for
cols = ['Temp', 'Precip', 'Year']
final = pd.DataFrame()
for key, grp in df.groupby(['ID']):
#minimum values based on year
replace = grp.loc[grp['Year'] == grp['Year'].min()]
#replace the values
for col in cols:
grp[col] = replace[col].unique()[0]
#append the values
final = final.append(grp)
print(final)
产生:
Albedo ID Precip Temp Year
0 0.2 1 200 20 1950
1 0.4 1 200 20 1950
2 0.5 1 200 20 1950
3 0.3 2 45 5 1916
4 0.5 2 45 5 1916
5 0.1 2 45 5 1916
所以在ID
的每个群组中,我找到最低Year
,然后更新Temp
,Precip
和其他行的Year
。这似乎是很多循环,我想知道是否有更好的方法。
答案 0 :(得分:1)
在groupby
上的ID
+ transform
+ idxmin
上使用Year
获取一系列索引。将这些索引传递给loc
以获得结果。
idx = df.groupby('ID').Year.transform('idxmin')
df.iloc[idx]\
.reset_index(drop=True)\
.assign(Albedo=df.Albedo)
Albedo ID Precip Temp Year
0 0.2 1 200 20 1950
1 0.4 1 200 20 1950
2 0.5 1 200 20 1950
3 0.3 2 45 5 1916
4 0.5 2 45 5 1916
5 0.1 2 45 5 1916