pandas 在dataframe中填充前一行和另一列中的变化的总和

cyvaqqii  于 2023-04-28  发布在  其他
关注(0)|答案(2)|浏览(121)

我有一个 Dataframe ,它有一些nan值。我想通过在Factor列中添加前一行的更改来填充它们。 Dataframe 看起来像这样:

Value Col    Factor
2022-11-30  0.020       84
2022-12-31  0.015       77
2023-01-31  NaN         90
2023-02-28  NaN         44
2023-03-31  NaN         39

为了填充df.iloc[2, 0],我想将df.iloc[1,0]Factor列中的变化相加(在这种情况下是90-77 = 13)。预期的输出如下:

Value Col    Factor
2022-11-30  0.020       84
2022-12-31  0.015       77
2023-01-31  13.015      90
2023-02-28  59.015      44
2023-03-31  64.015      39

我尝试了for循环,它可以工作。但是找不到一种方法,这是pandas函数,但填充nans行的行。我使用df['Factor'].diff(1)得到Factor列的差异,但不知道如何填充这些nans行。

lnvxswe2

lnvxswe21#

您可以使用掩码cumsum

df['Value Col'] = (
df['Factor'].diff()
 .abs()
 .where(df['Value Col'].isna())
 .cumsum()
 .add(df['Value Col'].ffill(), fill_value=0)
)

输出:

Value Col  Factor
2022-11-30      0.020      84
2022-12-31      0.015      77
2023-01-31     13.015      90
2023-02-28     59.015      44
2023-03-31     64.015      39
eufgjt7s

eufgjt7s2#

我认为上面的答案应该修改为使用groupby
所以我又杀鸡儆猴了

示例

data = {'Date': {0: '2022-11-30', 1: '2022-12-31', 2: '2023-01-31', 
                 3: '2023-02-28', 4: '2023-03-31', 5: '2023-04-30', 6: '2023-05-31'}, 
        'Value Col': {0: 0.02, 1: 0.015, 2: None, 3: None, 4: None, 5: 0.01, 6: None}, 
        'Factor': {0: 84, 1: 77, 2: 90, 3: 44, 4: 39, 5: 19, 6: 49}}
df = pd.DataFrame(data)

df

Date      Value Col Factor
0   2022-11-30  0.020   84
1   2022-12-31  0.015   77
2   2023-01-31  NaN     90
3   2023-02-28  NaN     44
4   2023-03-31  NaN     39
5   2023-04-30  0.010   19
6   2023-05-31  NaN     49

我需要石斑鱼组

gr = df['Value Col'].notna().cumsum()

gr

0    1
1    2
2    2
3    2
4    2
5    3
6    3

编码

cumsum & ffill等按groupby

df['Value Col'] = (df['Factor']
                   .groupby(gr).diff().abs()
                   .groupby(gr).cumsum()
                   .add(df['Value Col'].ffill(), fill_value=0))

df

Date      Value Col Factor
0   2022-11-30  0.020   84
1   2022-12-31  0.015   77
2   2023-01-31  13.015  90
3   2023-02-28  59.015  44
4   2023-03-31  64.015  39
5   2023-04-30  0.010   19
6   2023-05-31  30.010  49

相关问题