我想在“值”列中放置零行,直到每个组的第一个非零值的索引为止。
输入
df = pd.DataFrame({'date': ['2019-01-01', '2019-01-02', '2019-01-03','2019-01-04',
'2019-01-01', '2019-01-02', '2019-01-03','2019-01-04',
'2019-01-01', '2019-01-02', '2019-01-03','2019-01-04'],
'value' : [0, 50, 100, 120, 0, 10, 0, 20, 0, 0, 10, 0],
'group': ['A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'C', 'C', 'C', 'C']
})
df
date value group 0 2019-01-01 0 A 1 2019-01-02 50 A 2 2019-01-03 100 A 3 2019-01-04 120 A 4 2019-01-01 0 B 5 2019-01-02 10 B 6 2019-01-03 0 B 7 2019-01-04 20 B 8 2019-01-01 0 C 9 2019-01-02 0 C 10 2019-01-03 10 C 11 2019-01-04 0 C
输出
date value group 1 2019-01-02 50 A 2 2019-01-03 100 A 3 2019-01-04 120 A 5 2019-01-02 10 B 6 2019-01-03 0 B 7 2019-01-04 20 B 10 2019-01-03 10 C 11 2019-01-04 0 C
类似于Find first non-zero value in each column of pandas DataFrame,但将数据拖放到索引并进行分组。
答案 0 :(得分:3)
使用groupby
和cumsum
,将结果与零进行比较:
df[df.groupby('group')['value'].cumsum().gt(0)]
date value group
1 2019-01-02 50 A
2 2019-01-03 100 A
3 2019-01-04 120 A
5 2019-01-02 10 B
6 2019-01-03 0 B
7 2019-01-04 20 B
10 2019-01-03 10 C
11 2019-01-04 0 C
这是一个稍微通用的版本,应该可以删除具有任何前导值的行,
thresh = 0
df[df['value'].ne(thresh).groupby(df['group']).cumsum().gt(0)]
date value group
1 2019-01-02 50 A
2 2019-01-03 100 A
3 2019-01-04 120 A
5 2019-01-02 10 B
6 2019-01-03 0 B
7 2019-01-04 20 B
10 2019-01-03 10 C
11 2019-01-04 0 C