替换groupby和condition中的列值

时间:2018-01-08 00:06:40

标签: python pandas dataframe group-by pandas-groupby

我有一个数据框,我想在组中找到列的最小值,然后根据该行更新其他一些列的值。

以下代码可以满足我的需求:

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,然后更新TempPrecip和其他行的Year。这似乎是很多循环,我想知道是否有更好的方法。

1 个答案:

答案 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