熊猫按组下降前导零值

时间:2019-06-12 17:58:03

标签: python pandas

我想在“值”列中放置零行,直到每个组的第一个非零值的索引为止。

输入

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,但将数据拖放到索引并进行分组。

1 个答案:

答案 0 :(得分:3)

使用groupbycumsum,将结果与零进行比较:

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