繁体   English   中英

Pandas 移位行和回填(时间序列对齐)

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM