假设我具有以下数据框:
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])
但是没有用。
答案 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']