创建一个新列-仅按组分配最后一个值

时间:2019-10-24 18:25:29

标签: python pandas numpy

假设我具有以下数据框:

        date    sku        Q     f   
0   2019-10-23  1101692 10.000  001 
1   2019-10-24  1101692 10.000  002 
2   2019-10-23  1101692 15.000  007 
3   2019-10-22  1101692 -10.000 100 
4   2019-10-23  1101692 -10.000 100 
5   2019-10-23  1101692 -15.000 100 
6   2019-10-21  1101692 600.000 100 

使用此groupby命令按组获取最后一个值:

df.groupby(['sku', 'f']).last()

我知道了:

              data        q 
sku      f          
1101692 001 2019-10-23  10.000  
        002 2019-10-24  10.000  
        007 2019-10-23  15.000  
        100 2019-10-21  600.000 

我正在尝试创建一个具有“ q”列值(每个组的最后一个值)的新列。

预期输出:

         date    sku        Q     f  New_column 
0   2019-10-23  1101692 10.000  001    10.000
1   2019-10-24  1101692 10.000  002    10.000
2   2019-10-23  1101692 15.000  007    15.000
3   2019-10-22  1101692 -10.000 100     NaN
4   2019-10-23  1101692 -10.000 100     NaN
5   2019-10-23  1101692 -15.000 100     NaN
6   2019-10-21  1101692 600.000 100    600.000

什么是创建此新列的好方法。我已经尝试过使用iloc,但这似乎是技巧。

然后我尝试使用

df['new_column'] = df.groupby(['sku', 'f'])['q'].apply(lambda x: x.index[0])

但是没有用。

3 个答案:

答案 0 :(得分:1)

您实际上并不需要groupby(),您只需这样做:

df['new_col'] = df['Q'].mask(df.duplicated(['sku', 'f'], keep='last'))

输出:

         date      sku      Q    f  new_col
0  2019-10-23  1101692   10.0    1     10.0
1  2019-10-24  1101692   10.0    2     10.0
2  2019-10-23  1101692   15.0    7     15.0
3  2019-10-22  1101692  -10.0  100      NaN
4  2019-10-23  1101692  -10.0  100      NaN
5  2019-10-23  1101692  -15.0  100      NaN
6  2019-10-21  1101692  600.0  100    600.0

答案 1 :(得分:1)

分配df的方法是通过merge

df.merge(df.groupby(['sku', 'f'], as_index=False).last().rename(columns={'Q':'q'}), 
         on=['sku', 'f', 'date'], 
         how='outer')

         date      sku      Q    f      q
0  2019-10-23  1101692   10.0    1   10.0
1  2019-10-24  1101692   10.0    2   10.0
2  2019-10-23  1101692   15.0    7   15.0
3  2019-10-22  1101692  -10.0  100    NaN
4  2019-10-23  1101692  -10.0  100    NaN
5  2019-10-23  1101692  -15.0  100    NaN
6  2019-10-21  1101692  600.0  100  600.0

答案 2 :(得分:1)

loc一起使用可调用项

df['New_column'] = df.loc[lambda x: x.groupby(['sku', 'f']).tail(1).index, 'Q']

Out[581]:
         date      sku      Q    f  New_column
0  2019-10-23  1101692   10.0    1        10.0
1  2019-10-24  1101692   10.0    2        10.0
2  2019-10-23  1101692   15.0    7        15.0
3  2019-10-22  1101692  -10.0  100         NaN
4  2019-10-23  1101692  -10.0  100         NaN
5  2019-10-23  1101692  -15.0  100         NaN
6  2019-10-21  1101692  600.0  100       600.0

注意:如果您不喜欢可通话的话,可以尝试直接将df分组为:df.loc[df.groupby(['sku', 'f']).tail(1).index, 'Q']