我有以下格式的数据框,带有时间序列
A B C 201401 201402 201403
a1 b1 c1 100 200 300
a2 b2 c2 0 250 0
我已使用Pandas.melt来展平这些数据并获得以下格式。
A B C YYYYMM Value
a1 b1 c1 201401 100
a1 b1 c1 201402 200
a1 b1 c1 201403 300
a2 b2 c2 201401 0
a2 b2 c2 201402 250
a2 b2 c2 201403 0
现在对于[A B C]的特定组合我只希望时间序列从非零值开始。所以我的输出应该是这样的。
A B C YYYYMM Value
a1 b1 c1 201401 100
a1 b1 c1 201402 200
a1 b1 c1 201403 300
a2 b2 c2 201402 250
a2 b2 c2 201403 0
我试过了,
df.groupby(['A','B','C']).apply(lambda x: x['Value'][np.where(x['Value']>0)[0][0]:]
这只是给了我时间序列,并不意味着改变。 我该怎么做才能实现这个目标?
答案 0 :(得分:0)
我继续你的分组然后过滤的想法。基本思想是采用每个组并找到第一个非零值索引,假设它们已经按日期排序。然后只是取消组合并清理。
def applyFunc(row):
row_values = np.array(row.Value)
first_non_zero_index = next((i for i, x in enumerate(row_values) if x), None)
return row.iloc[first_non_zero_index:]
df.groupby(['A','B','C']).apply(applyFunc).drop(["A","B","C"],axis=1).reset_index().drop("level_3",axis=1)
中的代码段