DataFrameGroupBy diff() 条件

Lad*_*lav 5 python dataframe pandas

假设我有一个数据框:

df = pd.DataFrame({'CATEGORY':['a','b','c','b','b','a','b'],
                   'VALUE':[pd.np.NaN,1,0,0,5,0,4]})
Run Code Online (Sandbox Code Playgroud)

看起来像

    CATEGORY    VALUE
0      a         NaN
1      b         1
2      c         0
3      b         0
4      b         5
5      a         0
6      b         4
Run Code Online (Sandbox Code Playgroud)

我把它分组:

df = df.groupby(by='CATEGORY')
Run Code Online (Sandbox Code Playgroud)

现在,让我通过一组“b”的示例来展示我想要什么:

df.get_group('b')
Run Code Online (Sandbox Code Playgroud)

B组:

    CATEGORY    VALUE
1      b          1
3      b          0
4      b          5
6      b          4
Run Code Online (Sandbox Code Playgroud)

我需要:在每个组的范围内,计算VALUE值之间的 diff() ,跳过所有NaNs 和0s 。所以结果应该是:

    CATEGORY    VALUE  DIFF
1      b          1      - 
3      b          0      -
4      b          5      4
6      b          4     -1
Run Code Online (Sandbox Code Playgroud)

pan*_*sen 4

您可以使用在删除和值diff后减去值:0NaN

df = pd.DataFrame({'CATEGORY':['a','b','c','b','b','a','b'],
               'VALUE':[pd.np.NaN,1,0,0,5,0,4]})

grouped = df.groupby("CATEGORY")

# define diff func
diff = lambda x: x["VALUE"].replace(0, np.NaN).dropna().diff()
df["DIFF"] = grouped.apply(diff).reset_index(0, drop=True)

print(df)

  CATEGORY  VALUE  DIFF
0        a    NaN   NaN
1        b    1.0   NaN
2        c    0.0   NaN
3        b    0.0   NaN
4        b    5.0   4.0
5        a    0.0   NaN
6        b    4.0  -1.0
Run Code Online (Sandbox Code Playgroud)