[英]Pandas Shift Rows and Backfill (Time-Series Alignment)
我有运行总计的时间序列客户数据,如下所示:
week1 | week2 | week3 | week4 | week5
user1 20 40 40 50 50
user2 0 10 20 30 40
user3 0 0 0 10 10
我正在寻找支出趋势,所以我想将我的所有行从第一周开始,并用它们的最后一个值回填,结果:
week1 | week2 | week3 | week4 | week5
user1 20 40 40 50 50
user2 10 20 30 40 40
user3 10 10 10 10 10
任何帮助都会很棒!
您可以非常紧凑地执行此操作:
df.iloc[:, 1:] = df.iloc[:, 1:]. \
apply(lambda row: row.shift(-np.argmax(row > 0)), axis=1). \
ffill(axis=1)
但在这 1 条语句中发生了很多事情
iloc[:, 1:]
选择所有行,除了第一列之外的所有行(因为我们对接触用户列不感兴趣。我的回答假设用户是一列,如果用户是索引,那么你可以删除此答案中[:, 1:]
两个出现。
apply(<function>, axis=1)
将提供的函数应用于每一行
np.argmax
[正如我在这里使用的]在数组中找到满足条件的第一个索引。 在这种情况下,第一个值 > 0 的位置
row.shift(-np.argmax(row > 0))
根据第一个大于 0 值的位置动态向后移动行。
ffill
forward 用最后一个非空值填充空值。
@Haleemur Ali 的回答很好。
另一种方法是向后插入。
数据
df=pd.DataFrame({'user':['user1','user2','user2'],'week1':[20,0,0],'week2':[40,10,0],'week3':[40,20,0],'week4':[50,40,10],'week5':[50,40,10]})
df.set_index('user', inplace=True)#.rename_axis(None)
df
用 NaN 替换零
df.replace(0, np.nan, inplace=True)
df
然后只是插值
df.interpolate(method='linear', axis=1,limit=None,inplace=True,limit_direction='backward',limit_area=None,downcast=None,)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.