替换分组和条件内的列值
2018-01-08
4918
我有一个数据框,我想在其中找到一个组内某一列的最小值,然后基于该行更新其他一些列的值。
以下代码可实现我想要的功能:
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
。这似乎需要很多循环,但我想知道是否有更好的方法。
1个回答
对
ID
使用
groupby
+ 对
Year
使用
transform
+ 对
idxmin
获得一系列索引。将这些索引传递给
loc
以获取结果。
(df.iloc[df.groupby('ID')['Year'].transform('idxmin')]
.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
cs95
2018-01-08