我想用给定组的最后一个有效值填充数据帧NaN.例如:
import pandas as pd import random as randy import numpy as np df_size = int(1e1) df = pd.DataFrame({'category': randy.sample(np.repeat(['StrawBerry','Apple',],df_size),'values': randy.sample(np.repeat([np.NaN,1],df_size)},index=randy.sample(np.arange(0,10),df_size)).sort_index(by=['category'],ascending=[True])
提供:
category value 7 Apple NaN 6 Apple 1 4 Apple 0 5 Apple NaN 1 Apple NaN 0 StrawBerry 1 8 StrawBerry NaN 2 StrawBerry 0 3 StrawBerry 0 9 StrawBerry NaN
我想要计算的列如下所示:
category value last_value 7 Apple NaN NaN 6 Apple 1 NaN 4 Apple 0 1 5 Apple NaN 0 1 Apple NaN 0 0 StrawBerry 1 NaN 8 StrawBerry NaN 1 2 StrawBerry 0 1 3 StrawBerry 0 0 9 StrawBerry NaN 0
尝试shift()和iterrows()但无济于事.
解决方法
看起来你想先做一个
ffill
,然后做一个
shift
:
In [11]: df['value'].ffill() Out[11]: 7 NaN 6 1 4 0 5 0 1 0 0 1 8 1 2 0 3 0 9 0 Name: value,dtype: float64 In [12]: df['value'].ffill().shift(1) Out[12]: 7 NaN 6 NaN 4 1 5 0 1 0 0 0 8 1 2 1 3 0 9 0 Name: value,dtype: float64
要对每个组执行此操作,您必须先按groupby类别,然后应用此功能:
In [13]: g = df.groupby('category') In [14]: g['value'].apply(lambda x: x.ffill().shift(1)) Out[14]: 7 NaN 6 NaN 4 1 5 0 1 0 0 NaN 8 1 2 1 3 0 9 0 dtype: float64 In [15]: df['last_value'] = g['value'].apply(lambda x: x.ffill().shift(1))
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。